sudo su #root 계정으로 전환
도커는 이미지를 만들거나 받아서 호스트에 저장한 후 컨테이너로 run
해서 프로세스로 만든다.
이미지를 직접 만드는 방법
docker hub를 이용해서 공식 이미지나 다른 사용자들이 만들어놓은 이미지를 다운로드 받는 방법
Docker Hub에서 이미지를 받는 방법이다.
docker pull <이미지 이름>:<태그>
형식이다.
latest를 설정하면 최신 버전을 받는다.
latest 대신 16.04, 18.04를 입력해서 태그를 지정해 줄 수도 있다.
username/imagename:tagname
형식을 사용하면 공식 이미지가 아닌 사용자 이미지를 받는다.
docker pull ubuntu:latest
docker images
명령어를 통해 이미지를 출력하여 도커 이미지가 잘 받아졌는지 확인
docker images
형식
docker run <옵션> <이미지 이름> <실행할 파일>
옵션
it
--name
ubuntu 이미지를 컨테이너로 생성 후 이미지 안의 /bin/bash를 실행
docker run -it --name hello ubuntu /bin/bash
이제 Host OS와 완전 격리된 공간이 생성되었다.
cd
,ls
명령으로 확인해보면 완전 분리된 공간임을 알 수 있다.
exit
를 입력하면 Bash 쉘에서 빠져나온다.
(도커 -> HostOS)
- 저기서 만든 컨테이너에서
exit
를 입력하면 /bin/bash파일을 직접 실행했기 때문에 컨테이너가 정지상태로 바뀐다.
docker ps -a #모든 컨테이너 출력(정지 컨테이너 포함)
docker ps #실행 중인 컨테이너만 출력
docker start hello #hello 이름의 컨테이너 시작
docker restart hello #hello 이름의 컨테이너 재시작(재부팅)
docker attach hello #컨테이너에 접속(bash 쉘 접속)
docker stop hello #hello 이름의 컨테이너 종료
docker rm hello #hello 이름의 컨테이너 삭제
docker rm -f hello #hello 이름의 컨테이너 강제삭제
Container에서 필요한 프로그램들을 다운로드 받고 commit 명령어를 사용해서 이미지를 만들어도 될텐데, 왜 굳이 Dockerfile을 bash 명령어를 써가며 이미지를 빌드해야 되는지 몰랐다.
- commit 명령어를 사용해서 이미지를 생성하는 방법은 실무에서 거의 쓰이지 않는다고 한다.
- 패키지 업데이트도 힘들고, 버전 관리도 까다로워서 Dockerfile을 파일화해서 관리하는 것이 버전 관리나 패키지 업데이트 등의 면에서도 우월하다는 것이다.
Dockerfile은 Docker 이미지 설정 파일이다. 이 파일에 설정된 내용대로 이미지를 생성한다.
먼저 example 디렉토리를 생성한 뒤 해당 디렉토리로 이동한다. 모든 빌드와 관련된 파일들이 한 폴더(example)에서 이루어진다.
mkdir example
cd example
이번에 다루는 이미지 빌드는 모든 과정을 Dockerfile과 쉘 스크립트 파일로 통합하는 방법이다.
build-run.sh
파일을 만들고 인자를 전달해서 실행하면 이미지를 만들고 컨테이너로 run
까지 one-click으로 할 수 있게 된다.FROM
어떤 이미지를 기반으로 할지 설정한다.
Docker 이미지는 기존에 만들어진 이미지를 기반으로 생성한다.
만약 완전히 새로운 이미지를 생성하고 싶으면(“맨 땅에서 시작한다”) FROM scratch
를 쓰면 된다.
MAINTAINER
메인테이너(제작자) 정보이다.
RUN
쉘 스크립트/명령을 실행한다.
이미지 생성 중에는 사용자 입력을 받을 수 없다. 그래서 apt-get install
명령어를 사용할 경우 -y
옵션을 붙여야 한다.
VOLUME
호스트와 공유할 디렉터리 목록이다.
docker run
명령어에서 -v
옵션으로 설정할 수도 있다.
ADD
CMD
EXPOSE
호스트와 연결할 포트 번호이다.
기본적으로 컨테이너 실행시 docker run -p
옵션을 주게 되면 암묵적으로 EXPOSE가 된다.
FROM ubuntu:18.04
#set root password
RUN echo "root:ubuntu" | chpasswd
# install packages
RUN apt-get update \
&& apt-get install --yes --force-yes --no-install-recommends \
sudo \
software-properties-common \
xorg \
xserver-xorg \
xfce4 \
gnome-themes-standard \
gtk2-engines-pixbuf \
file-roller \
evince \
gpicview \
leafpad \
xfce4-whiskermenu-plugin \
ttf-ubuntu-font-family \
dbus-x11 \
vnc4server \
vim \
xfce4-terminal \
xrdp \
xorgxrdp
# add the user and designate sudo authority
RUN adduser ubuntu
RUN echo "ubuntu:ubuntu" | chpasswd
RUN echo "ubuntu ALL=(ALL:ALL) ALL" >> /etc/sudoers
#set the port number of xrdp
RUN sed -i 's/3389/port_number/' /etc/xrdp/xrdp.ini
#install xubuntu-desktop
RUN apt-get install --yes --force-yes --no-install-recommends \
xubuntu-desktop \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# insert entrypoint.sh and set ENTRYPOINT
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
RUN sed -i 's/3389/port_number/' /etc/xrdp/xrdp.ini
cs
ENTRYPOINT 명령어는 컨테이너가 처음 실행될 때(run/start 시) 한번 수행되는 스크립트를 지정한다.
ENTRYPOINT /entrypoint.sh
entrypoint.sh
#!/bin/bash
# create a dbus system daemon
service dbus start
# create the sock dir properly
/bin/sh /usr/share/xrdp/socksetup
# run xrdp and xrdp-sesman in the foreground so the logs show in docker
xrdp-sesman -ns &
xrdp -ns &
# run shell for interface
/bin/bash
build-run.sh
#!/bin/bash
#edit the port number in Dockerfile
sed -i 's/port_number/'$1'/' ./Dockerfile
#start building image from Dockerfile
docker build -t $2 .
#run container from built image
docker container run -d -it --name $3 -p $1:$1 $2
docker container start $3
#return Dockerfile into first state
sed -i 's/'$1'/port_number/' ./Dockerfile
./build-run.sh [포트번호] [이미지 이름] [컨테이너 이름]
위 명령어를 실행하게 되면 해당 포트 번호, 이미지 이름, 컨테이너 이름으로 이미지 빌드, 실행(run)까지 완료하게 된다.
./build-run.sh 2022 ubuntu second
Sending build context to Docker daemon 17.92kB
Step 1/10 : FROM ubuntu:18.04
---> 251b86c83674
Step 2/10 : RUN echo "root:ubuntu" | chpasswd
---> Using cache
---> e632b86526d4
Step 3/10 : RUN apt-get update && apt-get install --yes --force-yes --no-install-recommends sudo software-properties-common xorg xserver-xorg xfce4 gnome-themes-standard gtk2-engines-pixbuf file-roller evince gpicview leafpad xfce4-whiskermenu-plugin ttf-ubuntu-font-family dbus-x11 vnc4server vim xfce4-terminal xrdp xorgxrdp
---> Using cache
---> f78637311607
Step 4/10 : RUN adduser ubuntu
---> Using cache
---> 751c49e19cb1
Step 5/10 : RUN echo "ubuntu:ubuntu" | chpasswd
---> Using cache
---> 4d3bffb5b8fd
Step 6/10 : RUN echo "ubuntu ALL=(ALL:ALL) ALL" >> /etc/sudoers
---> Using cache
---> 5ca80c2c9b61
Step 7/10 : RUN sed -i 's/3389/2022/' /etc/xrdp/xrdp.ini
---> Using cache
---> 30d9aad27755
Step 8/10 : RUN apt-get install --yes --force-yes --no-install-recommends xubuntu-desktop && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
---> Using cache
---> 5cf2020e84b2
Step 9/10 : ADD entrypoint.sh /entrypoint.sh
---> Using cache
---> fd133f80adbd
Step 10/10 : ENTRYPOINT /entrypoint.sh
---> Using cache
---> eceb9609c6af
Successfully built eceb9609c6af
Successfully tagged ubuntu:latest
65021f1f32ccc3bbfc6ca40b8d09b07665d904b2cbd4d1ea67f9eef826611a14
second
root@akim-virtual-machine:/home/akim/example#
docker history <이미지 이름>:<태그>
예시
docker cp <컨테이너 이름>:<경로> <호스트 경로>
예시
docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그>
옵션
-a
옵션은 커밋한 사용자 정보
-m
옵션은 로그 메시지를 설정한다.
예시
docker commit -a "zini <zinirun.blogspot.com>" -m "add hello.txt" hello hello:0.2
hello 컨테이너를 hello:0.2 이미지로 생성하게 된다.
docker diff <컨테이너 이름> or <컨테이너 ID>
ubuntu@zini-01:/home/zini/doc_ex$ docker diff hello
C /run
A /run/xrdp
A /run/xrdp/sockdir
A /run/dbus
A /run/dbus/pid
A /run/dbus/system_bus_socket
C /tmp
A /tmp/.X11-unix
C /var
C /var/log
C /var/log/xrdp.log
C /var/log/xrdp-sesman.log
이미지나 컨테이너의 세부 정보를 출력한다.
ID를 사용해도 가능
docker inspect <이미지 or 컨테이너 이름>
예시
docker login
Docker 레지스트리 서버도 Docker Hub에 이미지로 제공된다.
먼저 레지스트리 이미지를 받는다.
docker pull registry:latest
docker run -d -p 5000:5000 hello-repository \
-v /tmp/registry:/tmp/registry \
registry:latest
run 명령어
컨테이너 실행
옵션
i
: 사용자가 입출력 할 수 있는 상태
t
: 가상 터미널 환경을 에뮬레이션 하겠다.
d
: 컨테이너를 일반 프로세스가 아닌 데몬프로세스로 실행하여 프로세스가 끝나도 유지되도록 한다.
e
: 환경변수 설정, 옵션을 사용하면 Dockerfile의 ENV 설정도 덮어써지게 된다.
p
: 호스트 컴퓨터에서 설정한 포트
h
: 컨테이너의 호스트 이름을 설정한다.
--link
: Docker 컨테이너끼리 연결할 때는 docker run 명령에서 --link 옵션을 사용
--rm
: 컨테이너를 일회성으로 실행할 때 주로 쓰이는데, 컨테이너가 종료될 때 컨테이너와 관련된 리소스(파일 시스템, 볼륨)까지 깨끗이 제거해준다.
docker run [옵션] [이미지이름 or 이미지ID] [실행할 파일] -v <host path> : <mounting point path in container>
-v
옵션을 사용해 docker run할 때 이미지만 변경하고 같은 볼륨을 마운트 하는 식으로 사용한다. 출처