groups rapa
sudo vim /etc/sudoers
21번째줄로 이동하면 rapa 계정에 대한 내용이 있다. 첫번째만 비밀번호 치고, 그다음은 X
systemctl status docker
docker -v
docker info
컨테이너 생성 위해서는 이미지가 필요
이미지는 정적인 파일이며 수정이 된다면 수정된 이미지를 이용한 모든 컨테이너는 변경된 내용이 반영된 상태에서 배포된다,
컨테이너는 이미지로부터 받은 내용을 토대로 생성되고 추가된 내용은 영구적으로 보관되지 않는다.
영구적인 보관이 필요하다면 volume을 이용해 데이터를 보관할 수 있다.
이미지가 보관되는 장소(registery)
local registry : 도커가 설치되어 있는 내 컴퓨터
docker image ls
내 컴퓨터 자체에 이미지를 보관할 수 있는 공간이 있는데, 여기를 로컬 저장소라고 하며 컨테이너 생성 시 1차적으로 이 로컬 저장소에서 이미지를 검색하게 된다. (만약 없다면 도커 허브로 연결)
private registry :
지정된 사용자/그룹의 접근만을 허용하는 저장소. aws, azure, gcp와 같은 퍼블릭 클라우드 환경에서 특정 사용자/계정/프로젝트 만을 위한 저장소
dockerhub에서 저장소를 생성할 때 private으로 생성하게 되면 지정된 사용자들만 접속할 수 있다.
registry 컨테이너를 이용하여 회사 내에 자체적으로 사설 저장소를 구현할 수 있다.’
별도의 프로젝트를 진행하는 경우 사용
도커 허브에 repository를 만들 때 private으로 만들고, 접속 허용하고자하는 id를 지정한다.
aws,azure,gcp와 같이 vpc 환경에서 작업하는 경우에도 사설 저장소를 운영할 수 있다.
우리 회사 내에 별도의 서버를 준비하고, 해당 서버에 registry라는 이미지를 이용하여 사설 저장소를 운영할 수 있는 컨테이너를 생성한다.
public registry : 모든 사용자들이 접근하고 이미지를 다운받을 수 있는 곳. dockerhub
이미지는 동일 IP 주소에서는 하루에 100개 정도 받을 수 있다. 계정별로 100개 받고싶다면 인증정보를 통해 접근해야 한다. 또한 로컬에 우리가 만들어둔 이미지를 public registry에 push하기 위해서도 인증 정보가 필요하다.
hub.docker.com에 들어가 로그인
Repository → Create Repository → 제목 입력 후 create
docker push [userid]/testweb:tagname
id/이름:버전
repository를 지우고싶다면, settings에 가서 delete repository
로그인 방법
username/password
rapa@rapa:~$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: [userid]
Password:
cat /home/rapa/.docker/config.json
# auth를 복사해서
echo "auth복사한값" | base64 -d
# 하면 user pw,name보이게 됨
# 위험하니 해당폴더 삭제
rm -rf /home/rapa/.docker/config.json
username/token
도커허브에서 내 계정 Account Settings → Security → New Access Token → Generate → 토큰 값 복사
echo "복사한토큰값" | docker login --username dustndus8 --password-stdin
public에 있는 이미지를 로컬 레지스트리로 pull
docker pull centos:7
centos7 컨테이너 배포하기
docker container run -it --name centos01 --hostname centos1 centos:7 /bin/bash
하면
[root@centos1 /]#
로 들어간 상태로 된다.
bare metal : container
1 : 0.97
RAM 1 : 1.01
접속된 컨테이너에서 나가기
- exit → 동작중인 컨테이너를 종료하고 빠져나옴
docker container ls
docker container ls --all
docker start centos01
rapa@rapa:~$ docker attach centos01
[root@centos1 /]#
nginx 이미지 다운로드 하기
- docker hub에 있는 nginx 최신 이미지를 로컬 저장소에 pull
docker pull nginx
rapa@rapa:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest b692a91e4e15 2 weeks ago 142MB
centos 7 eeb6ee3f44bd 11 months ago 204MB
nginx 배포하기
rapa@rapa:~$ docker container run -d --name nginx01 -p 8001:80 nginx
83709ca57e6d5f54caab325f3752b1c6b73dad53e9bc01a30ac76f2ebe53c0a3 # 생성된 ID
run : create + start
-d : 생성된 컨테이너가 백그라운드에서 동작
-p 8001:80 : 8001은 호스트의 Port(Ubuntu), 80은 컨테이너의 포트를 매핑. 즉, 외부 사용자가 8001:80으로 입력하면 컨테이너의 80번 포트로 연결해주겠다는 뜻. 정적 PAT
apa@rapa:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83709ca57e6d nginx "/docker-entrypoint.…" 54 seconds ago Up 53 seconds 0.0.0.0:8001->80/tcp, :::8001->80/tcp nginx01
044b03fee160 centos:7 "/bin/bash" 2 hours ago Up 2 hours centos01
httpd 실행하기
rapa@rapa:~$ docker container run -d --name httpd01 -p 8002:80 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
1efc276f4ff9: Already exists
aed046121ed8: Pull complete
4340e7be3d7f: Pull complete
80e368ef21fc: Pull complete
80cb79a80bbe: Pull complete
Digest: sha256:343452ec820a5d59eb3ab9aaa6201d193f91c3354f8c4f29705796d9353d4cc6
Status: Downloaded newer image for httpd:latest
e0d93fd1645e17358e4ef925225ecd9f2f48f48baca0a3c10d256a995b58a08e
우분투의 8002포트로 접속하면 httpd로 웹접속
지금은 attach로 직접 httpd로 들어갈 수 없는 상태
rapa@rapa:~$ docker container start httpd01
httpd01
rapa@rapa:~$ docker container exec httpd01 env
PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e0d93fd1645e
HTTPD_PREFIX=/usr/local/apache2
HTTPD_VERSION=2.4.54
HTTPD_SHA256=eb397feeefccaf254f8d45de3768d9d68e8e73851c49afd5b7176d1ecf80c340
HTTPD_PATCHES=
HOME=/root
결국, exec를 사용하면 컨테이너 내부로 직접 들어가지 않아도 컨테이너의 명령을 외부에서 전달하여 결과를 확인할 수 있다.
docker container run : 컨테이너 생성 + 컨테이너 실행
docker container ls —all : 동작/중지중인 모든 컨테이너의 리스트 확인가능
docker image ls : 로컬 저장소에 보관된 이미지의 리스트를 확인할 수 있다.
docker container exec : 컨테이너에게 명령을 전달하고, 결과를 호스트에서 확인할 수 있다.
docker container attach : 외부 연결용(console) 인터페이스가 있는 경우에는 컨테이너로 직접 들어갈 수 있다. (it 옵션을 주고 생성된 컨테이너야 함)
httpd를 이용하여 추가 웹서버를 실행 해보기
rapa@rapa:~$ docker container run -d --name httpd02 -p 8003:80 httpd
8e4e25796774601e9ab8beaf3bff0ea49112bdaceeba9fdc0b489cb1c183e134
웹서버마다 다른 html을 보여주고싶다면,
rapa@rapa:~$ touch index.html
rapa@rapa:~$ curl https://www.naver.com > index.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 241k 0 241k 0 0 1447k 0 --:--:-- --:--:-- --:--:-- 1447k
rapa@rapa:~$ docker container run -d --name httpd80 -p 8080:80 -v /home/rapa:/usr/local/apache2/htdocs httpd
3c783a3606b9287404af66cc1142a40ab9fd2c2b3c628a9f8e7dc520149d2e9f
/home/rapa 는 host, /usr/local/apache2/htdocs 는 컨테이너로 볼륨 마운트
또 다른 네이버페이지 웹서버를 띄우고싶다면
rapa@rapa:~$ docker container run -d --name httpd88 -p 8888:80 -v /home/rapa:/usr/local/apache2/htdocs httpd
웹서버 html을 다른 걸로 바꾸려면
rapa@rapa:~$ echo "hello" > index.html
이후 다시 8080포트와 8888포트로 접속하면, hello가 뜬 html 페이지가 보이게 된다.