본문 바로가기
IT이론/devops

도커를 공부해보자 - 1

by 육지상어 2021. 12. 11.
728x90
반응형

그동안 별 생각없이 그때그때 사용했다, 처음부터 공부해보자. 

 

출처 - https://zinirun.github.io/2020/08/15/how-to-use-docker/

-----------------------------------------------------------------------

등장배경은 마이크로서비스, 서버관리, 각 다른 환경에 의존성 파일들을 설치할때, 환경이 다르면 구동이 까다롭기 때문에 등장했다. vmware보다 구동이 빠르다.

중요한 개념은 image, 컨테이너이다. 
변하지않으며, 컨테이너에 변화가 생겨도 이미지에는 변화가 없다. 

도커 설치 후, 이미지를 받아서 설치해보자. 
도커 이미지를 받을땐

docker pull ubunto:latest
docker pull <이미지 이름> : < 태그 > 
latest는 최신 버전이고, 16.04, 18.04를 입력해서 태그 지정 받을 수도 있다.

이미지 이름에서 username/imagename:tagname 형식을 사용하면 사용자 이미지를 받는다.
docker images 를 사용하면 이미지가 무엇 있는지 볼 수 있다. 

docker run < 옵션 > < 이미지 이름> < 실행할 파일 > 형식이다. 

-it 옵션은 bash 쉘에 입출력을 할 수 있다. 
--name 옵션을 사용하면 컨테이너 이름을 지정 가능, 아니면 자동으로 이름 부여한다.

docker run -it --name hello ubuntu /bin/bash

위 코드는 우분투를 생성 후 , bin/bash를 실행한다. 
- it 옵션은 실행된 bash 쉘에 입출력을 한다. 
--name 옵션을 사용하면 컨테이너 이름을 지정 가능, 아니면 자동으로 실행한다.

exit를 실행하면, 컨테이너는 정지상태로 나온다.

컨테이너 관련 명령어. 
docker ps -a -> 모든 컨테이너 출력 ( 정지 컨테이너 포함 ) 
docker ps  -> 실행중인 컨테이너 출력
docker start hello -> 해당 이름의 도커 시작 
docker restart hello -> 해당 이름의 도커 재시작
docker attach hello -> 컨테이너에 접속 ( 베시 쉘 ) 
docker stop hello -> 해당 이름의 컨테이너 종료 
docker rm hello -> 해당 이름의 컨테이너 삭제 
docker rm -f hello -> 해당 이름의 컨테이너 강제삭제
이미지를 삭제하는 옵션은 rm 이고, 이미지를 삭제하는 명령어는 rmi이다. 

이미지를 빌드할때, commit 명령어를 사용해서 이미지를 만드는 방법이 있고, dockerfile을 bash 명령어를 써가며 이미지를 빌드하는 방법이 있다. 

Dockerfile을 만들어보자. 

Dockerfile은 Docker 이미지 설정 파일이다. 
이 파일에 설정된 내용대로 이미지를 생성한다. example을 생성한 뒤 해당 디렉토리로 이동하자. 
모든 빌드와 관련된 파일들을 한 폴더에서 관리한다. 

이미지 빌드의 모든 과정을 Dockerfile과 쉘 스크립트 파일로 통합하는 방법이다. 
build-run.sh 파일을 만들고 인자를 전달해서 실행하면, 이미지를 만들고 컨테이너를 런할 수있다. 

Dockerfile 관련 명령어는 아래와 같다. 

from -> 어떤 이미지를 기반으로 할지 설정한다. Docker 이미지는 기존에 만들어진 이미지를 기반으로 생성. 완전 새로운 이미지를 생성하고 싶으면, from scratch -> 맨 땅에서 시작한다. 

maintainer -> 제작자 정보이다. author 저자라고 생각하면 된다. 
run -> 쉘 스크립트 명령을 실행한자. 이미지 생성 중에는 사용자 명령을 만들 수 없다. 
그래서 apt-get install 명령어를 사용할 경우, -y 옵션을 붙여야한다. 

volume -> 호스트와 공유할 디렉토리 목록이다. docker run 명령어에서 -v 옵션으로 설정 가능하다. 

add -> 빌드시에 주어진 컨텍스트에서 첫번째 인자로 주어진 파일, 폴더를 두번째 인자로 주어진 컨테이너 경로에 추가한다. 

cmd -> 컨테이너가 시작되었을 떄, 실행할 실행 파일, 쉘 스크립트다. 

expose  ->호스트와 연결할 포트 번호이다. 외부와 통신을 가능하게 노출해준다. 
기본적으로 컨테이너 실행 시, docker run -p 옵션을 주게 되면, 암묵적으로 expose 옵션을 주게 된다. 

이 명령어를 기반으로 xrdp( 원격 접근 프로그램 ),vim들이 설치된 우분투 이미지 도커 파일은 아래와 같다.

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 

sed 명령어는 파일에 있는 특정 단어를 찾아서 다른 단어로 바꾸는 역할을 한다. 

entrypoint /entrypoint.sh 명령어는 컨테이너가 처음 실행될 때, run/ start 시, 한번 수행되는 스크립트를 지정하낟. 따라서 이미지를 빌드하고 컨테이너로 run 하면, 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

dbus , xrdp 서비스를 위한 설정이다. 

docker run에 필요한 최종 파일인, 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 build 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 -> Dockerfile -> entrypoint.sh 

받는 인자는 $1, $2, $3으로, 
./build-run.sh [포트번호] [이미지 이름] [컨테이너 이름]
이다.

이걸 매번 인자에 기입하기 싫으니, 도커 빌드 쉘  가장 상단에 박아주자.

# $1 = 5001 # 포트번호
# $2 = ubuntu # 이미지 이름
# $3 = test-ubuntu # 컨테이너 명
PORT_NUM=5002
IMAGE_NAME=ubuntu
CONTAINER_NAME=test-ubuntu
라고 상단에 박아주고, 실행시키면 
docker ps 라고 보면 보인다. 

docker 관리 명령어는 아래와 같다. 
hisroty -> docker history <이미지 이름>:<태그> 형식이다. 이미지 이름 대신 id를 사용할 수도 있다. 

cp -> docker cp hello:/etc/nginx/nginx.conf ./ 
docker cp <컨테이너 이름> : <경로> <호스트 경로> 형식이다. 호스트 경로에 컨테이너 내부 파일 nginx.conf 파일이 복사된다. 

commit -> docker commit -a "zini <zinirun.blogspot.com>" -m "add hello.txt" hello hello:0.2

docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그> 형식이다. 컨테이너의 변경 사항을 이미지 파일로 생성한다. -a 옵션은 커밋한 사용자 정보, -m 옵션은 로그 메시지를 설정한다. 
그렇게 hello 컨테이너를 hello:0.2 이미지로 생성하게 된다. 

diff -> docker diff <컨테이너 이름> 형식으로 된다. 

추가, 변경 삭제된 파일들을 출력해준다. 

inspect -> docker inspect hello 
docker inspect < 이미지 or 컨테이너 이름 > 형식으로, id를 사용해도 된다. 
이미지나 컨테이너 세부 정보를 출력한다. 
------------------------------
docker hub를 사용하기

일단 여기까지하자 

반응형

'IT이론 > devops' 카테고리의 다른 글

로드 밸런스란  (0) 2022.03.05
CD / CI란  (0) 2022.03.05
쿠버네티스, 컨테이너 오케스트레이션란  (0) 2022.03.05
컨테이너란  (0) 2022.03.05

댓글