기본 컨테이너 명령어
컨테이너 생성
- docker container run(생성/시작)
- docker container create(생성만 됨)
컨테이너 삭제
- docker container stop + docker container rm
- docker container rm -f
생성된 컨테이너에 연결하기
생성된 컨테이너에 명령 전달하기(들어가지 않고)
- docker container exec [컨테이너 이름] 필요한 명령
이미지 pull
- docker pull httpd: 도커허브에서 제공되는 공식이미지 중 최신 이미지를 pull -> local
- docker pull centos7: 도커허브 공식 centos 이미지 중 7 버전 -> local
이미지 리스트
컨테이너 리스트
- docker container ls --all
컨테이너 리스트 id만 뽑기
- docker container ls --all -q

모든 컨테이너 리스트 삭제
- docker container rm -f $(docker container ls --all -q)
이미지 정보
- docker image inspect 'imageID'(b692a91e4e15)
해당 이미지를 이용하여 컨테이터로 배포하면 처음 시작되는 명령:cmd
cmd와 비슷하게 처음 컨테이너가 시작되면 동작시키는 명령어: Entrypoint
도커의 이미지는 처음 만든 이미지를 기준으로 추가되는 내용을 레이어 형태로 얹게된다: Layers

- 최초 이미지를 base로 하여 추가되는 내용만 sha 형태로 저장된다.
이미지를 만드는 방법
- 동작중인 컨테이너를 commit 하여 이미지로 만든다
- Dockerfile을 이용하여 베이스이미지 지정, 추가 패키지 선택, 컨테이너로 동작시 실행할 명령어등을 지정한 뒤 이를 build 하면 로컬 저장소에 이미지가 생성된다.
docker container run 옵션들
- -i: 대화식 모드 열기
- -t: 단말 디바이스 제공(마치 ssh로 연결하는 것) 일반적으로 it 옵션은 함께 사용하는 경우가 많다
- -it는 붙여서 많이쓰는데 -it 뒤에 /bin/bash 또는 /bin/sh를 적어주면 컨테이너 실행시 쉘을 동작시켜 컨테이너에 들어갔을 때 쉘이 뜨게 해준다.
- -d: 컨테이너를 백그라운드에서 동작시킨다. 데이터베이스나 웹서버와 같이 생성된 컨테이너로 관리자가 즉시 진입할 필요가 없는 경우에 많이 사용한다.
- --name: 컨테이너에 이름 부여. 생성된 컨테이너는 기본적으로 id를 부여받고 이 중 12자리를 이용하여 관리할 수 있다. --name으로 이름을 부여할 수 있고 rename을 이용하여 나중에 변경할 수 있다. 단, 동시에 다수의 컨테이너(동일한 기능을 수행하는)를 생성하는 경우에는 이름을 지정하는 것이 불필요하다. 이름을 부여하지 않으면 자동으로 임의의 이름을 부여하게 된다.
- --hostname: 컨테이너 내에서 사용하는 컨테이너의 호스트 이름. 지정하지 않으면 자동으로 id 값이 호스트 이름이다.
- --rm: 삭제
- --env(-e): 컨테이너 내에서 사용할 시스템 환경 변수를 지정할 수 있다.
ex) -e MYSQL_DATABASE=testdb
- -v: 호스트 경로와 컨테이너 경로의 공유 볼륨 설정.
/home/rapa:/home/root <- host:container
/home/rapa:/home/root:ro <- host:container, read-only
볼륨마운트
- 호스트의 특정 디렉토리와 컨테이너의 특정 디렉토리를 마운트 할 때
- 별도의 볼륨을 만들어서 연결하는 방식으로도 사용된다(iSCSI, ceph)
- -h: 컨테이너의 호스트명 지정
- -p [Host 포트]:[Container port]: 호스트의 특정 포트와 컨테이너의 특정 포트를 매핑할 때 사용
- -P: 컨테이너에서 노출한 특정 포트를 호스트의 임의의 포트와 자동 매핑해준다.
- --link=[container:container_id]: 두 개 이상의 컨테이너를 연결하는 방법. 동일 호스트의 다른 컨테이너와 연결 설정으로 IP가 아닌 컨테이너의 이름을 이용해 통신. * 도커는 자체 DNS 서비스가 제공된다. 컨테이너간에는 private IP로 통신하는데 컨테이너를 재시작할 때 IP가 바뀔 수 있다. link를 해주면 이 문제를 해결할 수 있다.
docker container run -d --name wpdb1 -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=wordpress -v wpdb1:/var/lib/mysql mysql:5.7
docker container run -d --name wp1 -e WORDPRESS_DB_PASSWORD=test123 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_NAME=wordpress -p 8001:80 --link wpdb1:db1 wordpress
docker container exec wp1 cat /etc/hosts
...
172.17.0.4 db1 f623c24c6adc wpdb1 <--- link 된 컨테이너의 ID, 이름, alias 명 을 IP 주소와 함께 등록
172.17.0.2 1528100563f1 <-- 자신의 ID 와 IP 주소를 등록
- --restart: 처음 생성시, 호스트 재부팅시 컨테이너를 어떻게 실행할 것인가? 웹서버나 DB와 같이 상시적으로 동작해야하는 컨테이너의 경우에는 초기 생성시 --restart=always로 하여 실행에 문제가 있더라도 계속해서 실행을 시도하도록 설정해주는 것이 좋다.
Dockerfile 명령어
- RUN : 설정된 기본 이미지에 패키지 설치, 업데이트 등의 명령을 실행하고자 하는 경우 작성한다.
- [shell 형식]
RUN apt -y install nginx
RUN yum -y install httpd
- [exec 형식]
RUN ["echo", "이것은 테스트입니다"]
- CMD : 컨테이너로 배포될 때 실행할 명령어를
가령 web 서버 컨테이너를 실행시키고 싶다면 RUN 으로 베이스이미지에 웹서버를 설치하고 컨테이너가 실행될 때 웹서버 데몬이 동작해야 하므로 CMD 를 이용하여 데몬실행명령을 전달한다.
CMD ngingx -g 'daemon off;'
CMD ["nginx", "-g", "daemon off;"]
- ENTRYPOINT : 컨테이너로 배포될 때 사용하는 명령어
ENTRYPOINT nginx -g "daemon off;"
- CMD와 ENTRYPOINT : 둘 다 Dockerfile 내에서 1번만 사용하라. 여러번 사용하면 마지막 라인만 처리된다.
CMD, ENTRYPOINT에서 실행하는 명령어가 docker container run 에서 실행하는 옵션과 동일한 경우 ENTRYPOINT는 모두 처리한다. 하지만 CMD 는 동일 옵션이 있는 경우 docker container run 에 있는 옵션만을 처리한다. ENTRYPOINT는 고정적으로 실행할 명령을 작성하고 CMD는 변경될 가능성이 있는 매개변수, 옵션등에 대하여 지정할 때 주로 사용한다.
예)
FROM ubuntu
ENTRYPOINT ["top"]
CMD ["-d", "10"]
docker container run -it test:1.0
docker container run -it test:1.0 -d 2 <- 이렇게하면 위의 CMD는 무시 된다.
추가적으로 만약 컨테이너로 배포될 때 실행해야할 명령어가 ENTRYPOINT나 CMD 두 개로 부족할 경우에는 shell file을 만들고 CMD나 ENTRYPOINT를 이용하여 해당 쉘을 실행하도록 설정한다.
ADD a.sh /root/a.sh
CMD ["/bin/bash", "/root/a.sh"]
-
CMD와 ENTRYPOINT 공통점 : 둘 다 Dockerfile 내에서 1번만 사용하라. 여러번 사용하면 마지막 라인만 처리된다.
-
COPY: 호스트환경의 파일, 디렉토리를 이미지 안에 복사하는 경우 작성한다. 단순한 복사 작업만 지원한다. 빌드 작업 디렉토리 외부의 파일은 copy 할 수 없다.
-
ADD: COPY를 포함. URL에 있는 파일을 붙여넣기 하는 것도 가능하다. 또한 패키지, 압축파일의 경우에는 이를 해제하여 내용물만 붙여넣기 할 수 있다. 단, URL 상의 tar 파일등은 해제되지 않은 상태에서 붙여넣기 된다.
예)
photo, index.html을 압축한 test.tar
COPY test.tar /var/www/html
-> /var/www/html/test.tar 생성
ADD test.tar /var/www/html
-> /var/www/html/photho 생성
-> /var/www/html/index.html 생성
- VOLUME: 이미지에 볼륨을 할당하고자 할 때 사용한다.
VOLUME /var/log # 컨테이너의 /var/log를 호스트에 있는 볼륨과 연결해 준다.
VOLUME ["/var/log"]
VOLUME testvol1:/var/log
위와 같이 하면 ctn1, ctn2 , ... 등 모두 testvol1과 연결 된다. 그래서 특정 볼륨을 지정하지 않는편이다.
컨테이너의 여러 디렉토리를 볼륨과 연결하고 싶다면?
VOULME /var/log /var/www/html /var/lib/mysql
- EXPOSE: 호스트 네트워크를 통해 들어오는 트래픽을 리스닝하는 포트와 프로토콜을 지정한다.
- ONBUILD: 처음 이미지 빌드에 포함하지만 실행되지 않고, 해당 이미지가 다른 이미지의 기본 이미지로 사용되는 경우 실행될 명령을 지정할 때 작성한다.
예시: "우리는 웹 개발 팀장이다" 팀원들중에 /blog를 만드는 팀에게 아래와 같이 지시했다. 제가 index.html 파일을 만들테니까 blog 팀은 개발된 파일, 디렉토리를 blog.tar로 만들어서 빌드하세요!
처음 만드는 이미지: test:1.0
blog 팀은 이미지를 만들 때 FROM test:1.0을 해야한다.
- WORKDIR: 컨테이너 내에서 작업할 경로 설정
WORKDIR /var/www
~ <- /var/www에서 실행
WORKDIR /root
~ <- /root에서 실행
- USER: 작업 사용자 지정하기
- ARG: 컨테이너가 아니라 이미지에서 사용하는 변수 지정
Docker build (이미지 build)
Docker build [옵션]
- -t(tag): 이미지명:태그 를 지정하는 경우.
docker build -t myweb:1.0 이미지 생성
- -f(file): Dockerfile이 아닌 다른 파일명으로 Dockerfile을 만들었을 때 지정하는 옵션.
이렇게 생성한 이미지를 도커 허브에 올리고 싶다면?
docker tag myweb:1.0 gildong/myweb:1.0`
docker push gildong/myweb:1.0 # 사전에 docker login 필요함. 정상로그인 되면 로그인정보(api 주소 + auth 정보)가 홈 디렉토리 > .docker > config.json 파일에 작성된다.
일반적으로는 두 개 이상의 이미지를 생성하고자 한다면 별도의 디렉토리를 만들고 각 디렉토리에서 별도의 Dockerfile을 생성하는 형식으로 이미지를 만들게 된다.