안녕하세요 ^^ 저번시간에 설치만 해서 너무 간질간질 하셨을 여러분을 위해
지난 글에 이어서 Docker 기본 명령어에 대해 알아보는 시간을 가지도록 하겠습니다.
1. Image 가져오기
: 기본 개념에서와 같이 도커는 저장소(registry)에서 이미지를 가져와 사용을 합니다
$ docker pull nginx:latest
# docker images 명령어를 통해 현재 가지고 있는 이미지 확인 [kbseo@ip-172-20-1-221 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE # docker login [kbseo@ip-172-20-1-221 ~]$ 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: kbseo Password: WARNING! Your password will be stored unencrypted in /home1/kbseo/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
이미지를 땡겨 봅시다
# tag를 지정해주지 않으면 default로 latest 버전을 가져옵니다. # tag를 지정할 경우 # docker pull nginx:latest # 위의 명령어 대로 pull 가능 [kbseo@ip-172-20-1-221 ~]$ docker pull nginx Using default tag: latest latest: Pulling from library/nginx bc51dd8edc1b: Pull complete 66ba67045f57: Pull complete bf317aa10aa5: Pull complete Digest: sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f Status: Downloaded newer image for nginx:latest [kbseo@ip-172-20-1-221 ~]$ # 이미지 확인 [kbseo@ip-172-20-1-221 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2073e0bcb60e 3 weeks ago 127MB [kbseo@ip-172-20-1-221 ~]$
이미지를 가져왔으니 이제 실행시켜봐야죠!
2. Run Container
# docker ps 라는 명령어로 현재 실행중인 컨테이너를 확인합니다. # docker ps -a -> 중지된 컨테이너까지 모두 출력 [kbseo@ip-172-20-1-221 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
실행중인 컨테이너가 없네요
# docker run 이라는 명령어로 컨테이너를 실행시켜줍니다. # docker run <옵션> <이미지 이름> <실행할 파일> [kbseo@ip-172-20-1-221 ~]$ docker run -it -d -p 8080:80 --name=nginx nginx:latest 57c8f50ce8c565e7b8fcfbe3a730b4be9c7c0221606ee0ba7dc22295d1b8ae04 # 옵션 -i(interactive), -t(Pseudo-tty) -> Bash Shell에 입력 및 출력을 할 수 있습니다. # 옵션 --name -> 컨테이너의 이름을 지정해 줍니다. # 옵션 -d -> daemonized # 옵션 -p -> 포트포워딩 [kbseo@ip-172-20-1-221 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 57c8f50ce8c5 nginx:latest "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp nginx [kbseo@ip-172-20-1-221 ~]$ [kbseo@ip-172-20-1-221 ~]$ curl http://localhost:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> [kbseo@ip-172-20-1-221 ~]$
잘 뜨네요. 기쁩니다.
컨테이너를 실행했으니 내부로 들어가 봅시다.
3. Container 내부탐험
$ docker exec
# 내부장벽진입 [kbseo@ip-172-20-1-221 ~]$ docker exec -it nginx /bin/bash root@57c8f50ce8c5:/# # 진입완료 # 컨테이너의 hostname을 알아봅시다 root@57c8f50ce8c5:/# hostname 57c8f50ce8c5 root@57c8f50ce8c5:/# cat /etc/issue Debian GNU/Linux 10 \n \l root@57c8f50ce8c5:/# # Shell을 빠져나오려면 Ctrl + D 혹은 exit를 입력합니다. # exit로 나왔을 경우 container 도 쉘 종료메세지(exit 0)을 받고 자연스럽게 종료 되기때문에 docker start [컨테이더 ID ] 명령어로 재시작 혹은 ctrl+ p 혹은 ctrl + q 로 실행을 유지한 채 터미널로 빠져 나올 수 있습니다.
4. Image 삭제
: 보통은 이미지를 삭제하기 전 컨테이너를 먼저 삭제한 후 진행됩니다.
# docker rm 명령어를 통해 삭제합니다 # 컨테이너 삭제 [kbseo@ip-172-20-1-221 ~]$ docker rm nginx Error response from daemon: You cannot remove a running container 57c8f50ce8c565e7b8fcfbe3a730b4be9c7c0221606ee0ba7dc22295d1b8ae04. Stop the container before attempting removal or force remove # 어라? 삭제가 안되네요 # 먼저 중지를 해줍니다. # I will find you and I will kill you... [kbseo@ip-172-20-1-221 ~]$ docker kill nginx nginx # 다시삭제를 해봅니다. [kbseo@ip-172-20-1-221 ~]$ docker rm nginx nginx [kbseo@ip-172-20-1-221 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [kbseo@ip-172-20-1-221 ~]$ # 잘 삭제가 되네요
이미지도 지워버립시다.
# docker rmi 명령어를 통해 이미지를 삭제해줍니다. [kbseo@ip-172-20-1-221 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 2073e0bcb60e 3 weeks ago 127MB [kbseo@ip-172-20-1-221 ~]$ # $ docker rmi nginx:latest 혹은 $ docker rmi [ 이미지 ID ] [kbseo@ip-172-20-1-221 ~]$ docker rmi nginx:latest Untagged: nginx:latest Untagged: nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f Deleted: sha256:2073e0bcb60ee98548d313ead5eacbfe16d9054f8800a32bedd859922a99a6e1 Deleted: sha256:a3136fbf38691346715cac8360bcdfca0fff812cede416469653670f04e2cab0 Deleted: sha256:99360ffcb2da18fd9ede194efaf5d4b90e7aee99f45737e918113e6833dcf278 Deleted: sha256:488dfecc21b1bc607e09368d2791cb784cf8c4ec5c05d2952b045b3e0f8cc01e [kbseo@ip-172-20-1-221 ~]$ [kbseo@ip-172-20-1-221 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE
컨테이너를 삭제하기 전 이미지를 삭제할 경우 -f옵션으로 한꺼번에 삭제할 수 있습니다.
$ docker rmi -f [이미지 ID]
> 컨테이너도 강제삭제
이렇게 끝내면 너무 아쉬우니 부가적으로 이미지를 저장할때 aws s3로 저장하는 방법도 슬쩍 소개해 드리겠습니다.
aws가 좋아서 그런거는 아닙니다.
+ AWS S3에 컨테이너 이미지 저장
- Docker registry 이미지를 가져옵니다.
# docker pull registry:latest [kbseo@ip-172-20-1-221 ~]$ docker pull registry:latest latest: Pulling from library/registry 486039affc0a: Pull complete ba51a3b098e6: Pull complete 8bb4c43d6c8e: Pull complete 6f5f453e5f2d: Pull complete 42bc10b72f42: Pull complete Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7 Status: Downloaded newer image for registry:latest [kbseo@ip-172-20-1-221 ~]$
- 이미지를 컨테이너로 실행해줍니다.
# 다운받은 이미지 Run [kbseo@ip-172-20-1-221 ~]$ docker run -d -p 5000:5000 --restart=always --name docker-registry \ > -e REGISTRY_STORAGE=s3 \ > -e REGISTRY_STORAGE_S3_BUCKET=kbseo-s3 \ > -e REGISTRY_STORAGE_S3_ACCESSKEY=AKIAJMYYWQIA******* \ > -e REGISTRY_STORAGE_S3_SECRETKEY=YTOwsm0lDgghwjRHtR************ \ > -e REGISTRY_STORAGE_S3_REGION=ap-northeast-2 \ > registry 274a07c0c008d866e44215eb4b3626448e5ef11fa573acd69ecb3e000ebde7b2 [kbseo@ip-172-20-1-221 ~]$ # docker run -d -p 5000:5000 --restart=always --name docker-registr -> s3-registry 이미지 이름 지정 후 registry 기본포트 5000번으로 실행해줍니다 # -e SETTINGS_FLAVOR=s3 -> SETTINGS_FLAVOR는 s3로 설정해줍니다. # -e AWS_BUCKET=kbseo-s3 -> 저장할 버킷이름을 지정해주세요 # -e STORAGE_PATH=/registry -> 저장될 경로입니다. # -e AWS_KEY=AKIAJMYYWQIA******* -> IAM 혹은 루트계정의 Access Key를 입력해주세요 # -e AWS_SECRET=YTOwsm0lDgghwjRHtR************ -> IAM 혹은 루트계정의 Secret Key를 입력해주세요 docker run -d -p 5000:5000 --restart=always --name docker-registry \ -e REGISTRY_STORAGE=s3 \ -e REGISTRY_STORAGE_S3_BUCKET=kbseo-s3 \ -e REGISTRY_STORAGE_S3_ACCESSKEY=AKIAJMYYWQIA****** \ -e REGISTRY_STORAGE_S3_SECRETKEY=YTOwsm0lDgghwjRHtR************ \ -e REGISTRY_STORAGE_S3_REGION=ap-northeast-2 \ registry
- 이제 s3로 푸시해볼 차례입니다.
# 어떤 이미지를 푸시해볼까.... [kbseo@ip-172-20-1-221 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry latest 708bc6af7e5e 4 weeks ago 25.8MB [kbseo@ip-172-20-1-221 ~]$ # 음.. 이미지를 다 지워서 push할 이미지가 없네요 # 만만한 hello-world 이미지를 받아봅니다. [kbseo@ip-172-20-1-221 ~]$ docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:fc6a51919cfeb2e6763f62b6d9e8815acbf7cd2e476ea353743570610737b752 Status: Downloaded newer image for hello-world:latest [kbseo@ip-172-20-1-221 ~]$ [kbseo@ip-172-20-1-221 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry latest 708bc6af7e5e 4 weeks ago 25.8MB hello-world latest fce289e99eb9 14 months ago 1.84kB localhost:5000/hello-world latest fce289e99eb9 14 months ago 1.84kB # tag를 지정해줍니다 # tag에 대해선 다음시간에 좀 더 자세히 다뤄보도록 하겠습니다. [kbseo@ip-172-20-1-221 ~]$ docker tag hello-world localhost:5000/hello-world # registry가 잘 돌아가고있네요 [kbseo@ip-172-20-1-221 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 274a07c0c008 registry "/entrypoint.sh /etc…" 7 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp docker-registry [kbseo@ip-172-20-1-221 ~]$ # s3에 올려볼 차례 [kbseo@ip-172-20-1-221 ~]$ docker push localhost:5000/hello-world The push refers to repository [localhost:5000/hello-world] af0b15c8625b: Pushed latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524 [kbseo@ip-172-20-1-221 ~]$
- 확인
잘 올라갔는지 s3로 가봅시다 총총총
요기 올라와져있네여
사실상 Code → Docker file → Docker Image 형태이기 때문에 이러한 과정에서 수정사항이 있으면 Docker file을 재작성 후 재빌드하고 이를 다시 Image화 하야하는데
천리길도 한걸음부터 라는 말이 있듯이!
이러한 과정은 다음시간에 이어서 소개해 드리겠습니다.