백앤드 10년 프론트앤드 10년 이젠 서비스 만들기 10년을 시작해 본다. 첫번째로 도커 개념을 이해하고 나만의 환경을 만들어 본다.
개념과 기본 명령어
도커는 프로세스를 격리시켜 실행해주는 도구이다.
도커 = 도커 엔진 + 도커 클라이언트로 클라이언트는 사용자가 명령을 전달하고, 서버는 명령을 수행한다. 서버는 보통 시스템 서비스로 등록된다.
예) 도커 목록 보기
$ docker ps
exit 명령으로 container가 죽은 목록을 확인 할 때 -a 옵션
$ docker ps -a
도커 이미지 = 실행을 위한 애플리케이션 파일의 집합
IMAGE ID는 고유의 해쉬값이다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
run-java 1.0 8e445847d25d 16 months ago 643MB
tomcat 8.5.15 b8dfe9ade316 3 years ago 334MB
java latest d23bdf5b1b1b 3 years ago 643MB
이미지는 원격의 도커 저장소에서 pull받을 수도 있다. tag를 지정하지 않으면 기본 latest가 적용된다.
$ docker pull <image_name>:<tag>
예)
$ docker pull centos
도커 실행예 -it 는 쉘을 실행하기 위한 옵션, bash를 실행한다. --name 옵션을 주면 실행 이미지의 별칭을 설정할 수 있다.
$ docker run -it <ImageName:tag> <command>
예)
$ docker run -it centos:latest bash
죽은 컨테이너 다시 시작하기는 container Id를 사용한다.
$ docker restart <container-hash-id>
예)
$ docker ps -a 로 container id 확인
$ docker restart afb7d8bdrexac
$ docker ps
프로세스와 터미널 상의 입출력 연결은 attach
$ docker attach afb7d8bdrexac
도커 컨테이너는 도커 이미지를 기반으로 실행된 격리된 프로세스이다. 따라서 컨테이너는 가상머신이라기 보다는 프로세스이다.
이미지의 변경사항을 파악하기는 docker diff 명령을 사용한다. A (ADD), C (Change), D (Delete) 이다. 기존 컨테이너에 새로운 기능을 넣고 새로운 이미지를 만들려면 docker commit 명령을 사용한다. rm은 컨테이너 삭제, rmi는 이미지 삭제이다.
$ docker diff <container id>
$ docker commit <container id> <image name>
종료 상태 컨테이이너 ID를 가지고 rm으로 삭제한다.
$ docker ps -a
$ docker rm <container id>
$ docker rmi <image name> (또는 image id)
Dockerfile로 이미지 만들기
Docker 이미지를 만들수 있는 DSL를 통해 Dockerfile 파일 내용을 구성한다.
- FROM: 어떤 이미지로부터 새로운 이미지를 생성할지 지정한다.
- RUN: 실행할 컨테이너안에서 실행할 명령을 정의한다. 이미지 빌드시 한번만 수행한다. 다른 명령 이어 수행 && 다음줄 이어서 \ 사용
- COPY: 호스트 머신의 파일이나 폴더를 도커 컨테이너 안으로 복사
- ADD: COPY와 동일, url기반 다운로드, 압축파일은 압축 풀어줌
- CMD: 컨테이너 안에서 실행할 명령어를 지정한다. 컨테이너 실행시 덮어 쓸 수 있다.
- FOREGROUND: 실행 방식
- ENTRYPOINT: 컨테이너 안에서 실행될 프로세스(명령)을 지정한다. CMD의 인자값이 ENTRYPOINT에 전달된다.
- LABEL: key=value 설정
- ENV: 컨테이너 실행 환경 변수값 설정
- ARG: 이미지 빌드시 환경 변수값 설정, "--build-arg key=value" 로 docker image build 명령 수행시 설정도 가능한다.
- WORKDIR: 실행하는 디렉토리 위치를 변경한다. cd 명령과 같다.
- EXPOSE: 가상머신에 오픈할 포트를 지정한다.
Dockerfile 명으로 파일을 생성한다. ubuntu에 git 까지 설치하는 하기 내용을 넣는다.
FROM ubuntu:bionic
RUN apt-get update
RUN apt-get install -y git
빌드하고 이미지 확인한다.
$ docker build -t ubuntu:bionic-git .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu:bionic
bionic: Pulling from library/ubuntu
....
---> cdc67675bfc4
Successfully built cdc67675bfc4
Successfully tagged ubuntu:bionic-git
확인 하기
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu bionic-git cdc67675bfc4 14 seconds ago 197MB
ubuntu bionic 56def654ec22 4 weeks ago 63.2MB
도커를 실행하여 컨테이너에서 git 설치 확인한다.
$ docker run -it ubuntu:bionic-git bash
root@1aef904d7e26:/# git --version
git version 2.17.1
이미지의 빌드과정을 보고 싶을 경우 history 명령을 이용한다.
$ docker history ubuntu:monawiki
IMAGE CREATED CREATED BY SIZE COMMENT
425046329513 2 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "bash… 0B
Dockerfile일 있는 이를 통해 이미지 빌드파일까지 있다면 향후 버전에 따른 영향에 대응할 수 있다. docker pull할 때 기본 레지스트리 정보는 info 명령으로 확인한다.
$ docker info
Client:
Debug Mode: false
Server:
Containers: 0
....
Registry: https://index.docker.io/v1/
pull 명령시에 Registory를 직접 지정할 수 있다. 레지스트리/네임스페이스/이미지명 => docker.io/library/ubuntu:bionic
$ docker pull docker.io/library/ubuntu:bionic
bionic: Pulling from library/ubuntu
171857c49d0f: Pull complete
419640447d26: Pull complete
61e52f862619: Pull complete
Digest: sha256:646942475da61b4ce9cc5b3fadb42642ea90e5d0de46111458e100ff2c7031e6
Status: Downloaded newer image for ubuntu:bionic
docker.io/library/ubuntu:bionic
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu bionic 56def654ec22 4 weeks ago 63.2MB
콘솔창에서 도커 허브 로그인은 login 명령이다. tag로 명칭을 만들고 push할 수 있다.
$ docker tag <로컬 이미지명> <docker-hub-id>/<이미지명>
"docker tag" requires exactly 2 arguments.
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
$ docker push <docker-hub-id>/<이미지명>
"docker push" requires exactly 1 argument.
Usage: docker push [OPTIONS] NAME[:TAG]
Docker Layer 개념
docker container layer의 변경사항을 알고 싶을 경우
$ docker diff <container id>
docker container layer의 변경사항을 이미지에 반영하고 싶을 경우
$ docker commit <container id> <new image name>
git을 포함시켜서 새로운 ubuntu:git 이미지 만들기
// 우분투 설치
$ docker pull ubuntu:focal
// git 있는지 확인
$ docker run -it ubuntu:focal /bin/sh -c 'git --version'
/bin/sh: 1: git: not found
// apt-get 업데이트
$ docker run -it ubuntu:focal /bin/sh -c 'apt-get update'
// 업데이트 이미지 커밋
$ docker commit $(docker ps -alq) ubuntu:git-layer-1
sha256:7c65ec0b9441f470a43e28a5c6dfc5a64a120090984e3c7bcd38540cb9ef0b1b
// 업데이트 layer에 git 설치
$ docker run ubuntu:git-layer-1 /bin/sh -c 'apt-get install -y git'
// git 설치 layer 커밋
$ docker commit $(docker ps -alq) ubuntu:git
sha256:e21b7d04736553bb0d995af6f6a751aca2e710f2e2f5874d026a89335a53ade9
// 설치 확인
$ docker run -it ubuntu:git bash -c 'git --version'
git version 2.25.1
// 이미지 확인
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu git e21b7d047365 3 minutes ago 208MB
ubuntu git-layer-1 7c65ec0b9441 5 minutes ago 98.8MB
ubuntu focal d70eaf7277ea 9 days ago 72.9MB
// history 확인
$ docker history ubuntu:git
IMAGE CREATED CREATED BY SIZE COMMENT
e21b7d047365 15 minutes ago /bin/sh -c apt-get install -y git 109MB
7c65ec0b9441 17 minutes ago /bin/sh -c apt-get update 25.9MB
d70eaf7277ea 9 days ago /bin/sh -c #(nop) CMD ["/bin/bash"]
위의 commit으로 이미지를 새롭게 생성한 것과 동일하게 Dockerfile로 빌드하여 이미지 생성하기
FROM ubuntu:focal
RUN apt-get update
RUN apt-get install -y git
빌드하기
$ docker build -t ubuntu:git2 .
Dockerfile로 생성된 이미지와 commit을 이용해 만든 최종 이미지는 같은 형태이다.
참조
www.44bits.io/ko/post/why-should-i-use-docker-container
- 서버운용기록을 코드화 할 수 있다.
- 도커 파일 만들기 = 서버 운영 기록 (Dockerfile)
- 도커 이미지 만들기 = 도커 파일 + 실행 시점
- 도커 컨테이너 만들기 = 도커 이미지 + 환경 변수
www.44bits.io/ko/post/easy-deploy-with-docker
www.44bits.io/ko/post/how-docker-image-work
joont92.github.io/docker/Dockerfile/