Docker 개인 저장소 registry에서 이미지를 pull 하여 받는 중 아래와 같은 에러 로그가 발생하였습니다.
$sudo docker pull 192.168.0.210:5000/nginxtest:0.1Error response from daemon: Get "https://192.168.0.210:5000/v2/": http: server gave HTTP response to HTTPS client$
해당 에러 로그가 발생하는 사유는 Docker 구성파일 데몬에 insecure-registries 부분이 등록이 안되어 있으면 에러가 발생합니다.
해결방법
Docker 구성 파일을 사용하여 설정
vi 편집기를 이용하여 daemon.json을 설정 (파일이 없다면 생성)$sudo vi /etc/docker/daemon.json사용하는 URL 및 IP를 등록하여 저장$cat /etc/docker/daemon.json{"insecure-registries": ["192.168.0.210:5000"]}$daemon.json 저장 후 docker 데몬 재시작$sudo systemctl restart docker문제없이 잘 받아오는 것을 확인$sudo docker pull 192.168.0.210:5000/nginxtest:0.10.1: Pulling from nginxtestDigest: sha256:6d2ee764d8d6ce21b62c9cab92e28555c69b1a7028db7cf170b269ff97f901c1Status: Downloaded newer image for 192.168.0.210:5000/nginxtest:0.1192.168.0.210:5000/nginxtest:0.1$
history 명령은 동작중인 컨테이너에 입력된 명령어 history를 확인하는 명령어입니다.
이전 글에서 dockerfile로 만든 nginx 컨테이너입니다. 만들면서 사용된 RUN 커맨드가 history에 기록됩니다.
$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES61edbce54f41 nginxtest:0.1 "nginx" 18 minutes ago Up 18 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp jinsu-nginx$$sudo docker history[NAMES]:[TAG]EX)$sudo docker history nginxtest:0.1IMAGE CREATED CREATED BY SIZE COMMENT740379f9b11b 29 minutes ago /bin/sh -c #(nop) EXPOSE 443 0B 929f903e2540 29 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B ed64817830f8 29 minutes ago /bin/sh -c #(nop) CMD ["nginx"] 0B 2282172fd290 29 minutes ago /bin/sh -c #(nop) WORKDIR /etc/nginx 0B de12d0c872bc 29 minutes ago /bin/sh -c #(nop) VOLUME [/data /etc/nginx/… 0B 3da13963d2b2 29 minutes ago /bin/sh -c chown -R www-data:www-data /var/l… 0B 94c41b3f9ed3 29 minutes ago /bin/sh -c echo "\n daemon off;" >> /etc/ngi… 1.61kB d6e387a15b8b 29 minutes ago /bin/sh -c apt-get install -y nginx 21.1MB 2f20874facdc 29 minutes ago /bin/sh -c apt-get update 14.1MB abbb27fabc8c 29 minutes ago /bin/sh -c #(nop) MAINTAINER jinsu <djwlstn… 0B 13b66b487594 14 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 14 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B <missing> 14 months ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B <missing> 14 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 195kB <missing> 14 months ago /bin/sh -c #(nop) ADD file:276b5d943a4d284f8… 196MB $
Docker cp 명령으로 복사하기
cp 명령은 컨테이너에서 있는 파일을 복사하는 명령입니다.
명령어 입력 전$ls -altotal 12drwxrwxr-x 2 djwlstn123 djwlstn123 4096 Jun 2 09:42 .drwxr-xr-x 5 djwlstn123 djwlstn123 4096 Jun 2 08:54 ..-rw-rw-r-- 1 djwlstn123 djwlstn123 325 Jun 2 08:54 Dockerfile$동작중인 컨테이너 확인$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES61edbce54f41 nginxtest:0.1 "nginx" 30 minutes ago Up 30 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp jinsu-nginx$$sudo docker cp[NAMES]:[경로][저장경로]EX)$sudo docker cp jinsu-nginx:/etc/nginx/nginx.conf ./명령어 입력 후$ls -altotal 16drwxrwxr-x 2 djwlstn123 djwlstn123 4096 Jun 2 09:44 .drwxr-xr-x 5 djwlstn123 djwlstn123 4096 Jun 2 08:54 ..-rw-rw-r-- 1 djwlstn123 djwlstn123 325 Jun 2 08:54 Dockerfile-rw-r--r-- 1 root root 1615 Jun 2 09:05 nginx.conf$
Docker commit 명령으로 컨테이너 변경된 내용 이미지로 생성하기
commit 명령은 컨테이너의 추가로 변경된 사항을 이미지 파일로 생성하는 명령입니다.
명령어 입력 전$sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginxtest 0.1 740379f9b11b 43 minutes ago 232MBubuntu 14.04 13b66b487594 14 months ago 197MB$$sudo docker commit [옵션][컨테이너 이름][이미지 이름]:[태그]EX)$sudo docker commit jinsu-nginx nginxtest:0.2sha256:45fe3bfa31b6a7b9eb73603decb26779e348acd6e41ecd176cbeaf0c54c0c967$명령어 입력 후$sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginxtest 0.2 45fe3bfa31b6 11 seconds ago 232MBnginxtest 0.1 740379f9b11b 46 minutes ago 232MBubuntu 14.04 13b66b487594 14 months ago 197MB$
RUN 명령은 현재 생성되는 과정의 이미지 위에 스크립트 또는 명령을 실행해주는 명령입니다.
실행한 결과는 새 이미지로 생성되며, 실행 내역은 이미지 히스토리에 기록됩니다.
RUN [명령어]RUN ["실행파일", "매개변수1", "매개변수2"]EX)RUN apt-get -y updateRUN /bin/bash -c
CMD
CMD 명령은 컨테이너가 시작될 때 실행할 실행 파일 또는 쉘 스크립트 명령입니다.
Dockerfile에는 하나의 CMD 명령만 있을 수 있습니다. (둘 이상의 CMD를 나열하면 마지막 CMD만 적용됩니다.)
여러 명령어를 사용하려면 따로 스크립트를 생성하여 설정해주어야합니다.
CMD ["executable","param1","param2"](exec form, this is the preferred form)CMD ["param1","param2"](as default parameters to ENTRYPOINT)CMD command param1 param2 (shell form)CMD [명령]EX)CMD ["nginx"]
ENTRYPOINT
ENTRYPOINT 명령은 컨테이너가 시작될 떄 스크립트 또는 명령을 실행합니다.
docker run, start 명령으로 정지된 컨테이너를 시작할 때 실행됩니다.
ENTRYPOINT는 Dockerfile에 단 한번만 사용할 수 있습니다.
ENTRYPOINT [명령]ENTRYPOINT ["실행파일", "매개변수1", "매개변수2"]EX)셸(/bin/sh)로 명령 실행ENTRYPOINT cat /home/study/test.text셸없이 바로 실행ENTRYPOINT ["cat", "/home/study/test.text"]
ADD
ADD 명령은 새로운 파일이나 또는 디렉토리를 이미지로 복사하는 명령입니다.
절대경로를 사용할 수 없으며, 디렉토리를 지정하면 디렉토리 모든 파일을 복사합니다.
인터넷에 있는 URL을 설정할 수 있습니다.
ADD [복사할 파일 경로][이미지에 파일이 위치할 경로]EX)ADD *.txt /root/
COPY
COPY 명령은 새로운 파일이나 또는 디렉토리를 이미지로 복사하는 명령입니다.
ADD 명령과 달리 URL을 사용할 수 없으며 압축 파일 그대로 복사됩니다. 절대경로 방식으로 설정해야 합니다.
COPY [복사할 파일 경로][파일이 위치할 경로]EX)COPY test.txt relativeDir/
ENV
ENV 명령은 환경 변수를 설정하는 명령입니다.
ENV로 설정한 변수는 RUN, CMD, ENTRYPOINT에 적용됩니다.
ENV [환경변수][값]EX)ENV PATH /go/bin:$PATH
EXPOSE
EXPOSE 명령은 호스트와 연결할 포트 번호를 설정하는 명령입니다.
docker run --expose 옵션과 같은 설정입니다.
EXPOSE [포트번호]EX)EXPOSE 80EXPOSE 443
USER
USER 명령은 실행할 사용자 계정을 설정하는 명령입니다.
RUN, CMD, ENTRYPOINT에 적용됩니다.
USER [계정 사용자명]EX)USER nobody
VOLUME
VOLUME 명령은 디렉토리의 내용을 컨테이너에 저장하지 않고 외부 호스트(파일시스템)에 저장하도록 설정하는 명령입니다.
## 출력 리다이렉션 명령 실행의 표준 출력을 파일로 저장합니다. 명령어 실행 결과를 특정 장치로 보낼 수도 있습니다. EX) $ sudo echo "Good day" > ./Good.txt -rw-rw-r-- 1 guest guest 9 Jun 1 08:00 Good.txt
<
## 입력 리다이렉션 파일의 내용을 읽어 명령의 표준 입력을 사용 EX) $ cat < ./Good.txt Good day
>>
## 명령 실행의 표준 출력을 파일에 추가 >는 이미 파일에 내용을 덮어 쓰지만 >>는 파일 뒷부분에 내용을 추가 EX) $ sudo echo "Today" >> ./Good.txt Good day Today
2>
## 명령 실행의 표준 에러를 파일로 저장
2>>
## 명령 실행의 표준 에러를 파일에 추가
&>
## 표준 출력과 표준 에러를 모두 파일로 저장
1>&2
## 표준 출력을 표준 에러로 보내기
2>&1
## 표준에어를 표준 출력으로 보냅니다.
|
## 파이프 명령 실행의 표준 출력을 다른 명령의 표준 입력으로 보내줍니다. 첫번째 명령의 출력 값을 두번째 명령에서 처리합니다. EX) $ ls -al | grep Good -rw-rw-r-- 1 djwlstn123 djwlstn123 15 Jun 1 08:04 Good.txt
명령어 사용 전 $sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 3 days ago Exited (0) 3 days ago jinsu68bf744c5a56 ubuntu "/bin/bash" 3 days ago Exited (127) 3 days ago hello$$ sudo docker start [NAMES] or [CONTAINER ID]EX)$sudo docker start hellohello$명령어 사용 후$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 3 days ago Exited (0) 3 days ago jinsu68bf744c5a56 ubuntu "/bin/bash" 3 days ago Up 5 seconds hello$
사용 전 Exited 3 days ago 상태였는데 start 명령어를 사용하여 Up 5 seconds 상태가 되었습니다.
Docker restart 명령으로 컨테이너 재시작하기
restart 명령어는 PC를 재부팅하는 것처럼 컨테이너를 재시작하게 만들어 줍니다.
명령어 사용 전$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 3 days ago Exited (0) 3 days ago jinsu68bf744c5a56 ubuntu "/bin/bash" 3 days ago Up 8 minutes hello$$sudo docker restart [NAMES] or [CONTAINER ID]EX)$sudo docker restart hellohello$명령어 사용 후$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 3 days ago Exited (0) 3 days ago jinsu68bf744c5a56 ubuntu "/bin/bash" 3 days ago Up 2 seconds hello$
사용 전 Up 8 minutes 상태였는데 restart 재시작 후 Up 2 seconds 상태가 되었습니다.
Docker attach 명령으로 컨테이너에 접속하기
attach 명령어는 생성하여 동작 상태인 컨테이너에 접속하는 명령입니다.
$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 3 days ago Exited (0) 3 days ago jinsu68bf744c5a56 ubuntu "/bin/bash" 3 days ago Up 2 seconds hello$$sudo docker attach [NAMES] or [CONTAINER ID]EX)$sudo docker attach helloroot@68bf744c5a56:/#컨테이너를 생성할때 /bin/bash 설정은 안해줬을때 아래 옵션으로 접속$sudo docker exec -it [이미지 이름] /bin/bashroot@0ebf237f91f0:/#
사전에 컨테이너를 생성할 때 /bin/bash를 실행하여 컨테이너에 접속핵서 자유롭게 입력 출력이 가능합니다.
명령어 사용 전$sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES68bf744c5a56 ubuntu "/bin/bash" 4 days ago Up 16 hours hello$$sudo docker stop [NAMES]EX)$sudo docker stop hellohello$명령어 입력 후$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 4 days ago Exited (0) 16 hours ago jinsu68bf744c5a56 ubuntu "/bin/bash" 4 days ago Exited (137) 47 seconds ago hello$
pull 명령어는 Docker Hub 및 여러 사람들이 올린 이미지를 다운 받는 명령입니다.
$sudo docker pull [image name]:[tag] 형식으로 입력됩니다.$sudo docker pull ubuntu:14.0414.04: Pulling from library/ubuntu2e6e20c8e2e6: Pull complete0551a797c01d: Pull complete512123a864da: Pull completeDigest: sha256:96a36dd3bcd8f149fa9874c4e28c35c01f715b3e5f8f1a8e06b45887619bf43bStatus: Downloaded newer image for ubuntu:14.04docker.io/library/ubuntu:14.04$sudo docker pull ubuntu:latestlatest: Pulling from library/ubuntu 125a6e411906: Pull complete Digest: sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68dStatus: Downloaded newer image for ubuntu:latestdocker.io/library/ubuntu:latest이미지 이름에 jinsu/ubuntu 처럼 /앞에 사용자명을 입력하면 Docker Hub에서 해당 사용자가 올린 이미지를 다운받습니다.$sudo docker pull jinsu/ubuntu:latest
Docker images 명령으로 설치된 이미지 목록 확인
images 명령어는 다운받거나 설치된 이미지 목록을 출력해주는 명령입니다.
$sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest d2e4e1f51132 4 weeks ago 77.8MBubuntu 14.04 13b66b487594 14 months ago 197MBEX)$sudo docker images ubuntuREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest d2e4e1f51132 4 weeks ago 77.8MBubuntu 14.04 13b66b487594 14 months ago 197MB
Docker run 명령으로 컨테이너 실행하기
run 명령어는 이미지를 컨테이너로 생성하는 명령입니다.
$Docker run [option][image name][file name]EX)$sudo docker run -i -t --name hello ubuntu /bin/bash-i, -t 옵션을 사용하여 생성할 컨테이너안에 Bash를 사용하여 나중에 접속하여 입력 및 출력이 가능합니다.--name 옵션으로 컨테이너 이름을 지정 할 수 있습니다.
Docker ps 명령으로 컨테이너 목록 확인하기
ps 명령어는 모든 컨테이너 목록을 출력하는 명령입니다.
$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 3 days ago Exited (0) 3 days ago jinsu68bf744c5a56 ubuntu "/bin/bash" 3 days ago Exited (127) 3 days ago hello
ps -a 옵션을 사용하면 정지된 컨테이너까지 모두 출력하는 명령입니다.
옵션없이 ps만 사용하면 Up 상태인 컨테이너만 출력됩니다.
Docker rm 명령으로 컨테이너 삭제하기
run 명령어는 생성된 컨테이너를 삭제하는 명령입니다.
명령어 입력 전$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES750026f56674 ubuntu "bash" 4 days ago Exited (0) 17 hours ago jinsu68bf744c5a56 ubuntu "/bin/bash" 4 days ago Exited (137) 54 minutes ago hello$$sudo docker rm[NAMES] or [CONTAINER ID}EX)$sudo docker rm jinsujinsu$명령어 입력 후$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES68bf744c5a56 ubuntu "/bin/bash" 4 days ago Exited (137) 55 minutes ago hello$
Docker rmi 명령으로 이미지 삭제하기
rmi 명령어는 다운받은 이미지를 삭제하는 명령입니다.
명령어 입력 전$sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu latest d2e4e1f51132 4 weeks ago 77.8MBubuntu 14.04 13b66b487594 14 months ago 197MB$$sudo docker rmi [NAMES]:[TAG]EX)$sudo docker rmi ubuntu:latestError response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - container 68bf744c5a56 is using its referenced image d2e4e1f51132$지우려는 이미지가 컨테이너로 사용중이라면 위와같이 제거 할 수 없다는 에러 로그가 나옵니다.컨테이너 확인 해보면 해당 이미지로 생성된 컨테이너가 존재합니다.$sudo docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES68bf744c5a56 ubuntu "/bin/bash" 4 days ago Exited (137) 59 minutes ago hello$생성된 컨테이너 제거$sudo docker rm hellohello$이미지 삭제 명령$sudo docker rmi ubuntu:latestUntagged: ubuntu:latestUntagged: ubuntu@sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68dDeleted: sha256:d2e4e1f511320dfb2d0baff2468fcf0526998b73fe10c8890b4684bb7ef8290fDeleted: sha256:e59fc94956120a6c7629f085027578e6357b48061d45714107e79f04a81a6f0c$명령어 입력 후$sudo docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEubuntu 14.04 13b66b487594 14 months ago 197MB$