본문 바로가기
기타/도커&쿠버네티스

[Docker] 도커 엔진이란? 도커 엔진 사용하기

by 책 읽는 개발자_테드 2022. 10. 9.
반응형

· 도커 엔진에서 사용하는 기본 단위: 이미지, 컨테이너

 

도커 이미지

· 컨테이너를 생성할 때 필요한 요소로, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념

· 여러 개의 계층으로 된 바이너리 파일로 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용

· 이미지 이름 형식: [저장소 이름]/[이미지 이름]:[태그]

- 저장소: 이지미가 저장된 장소를 의미한다. 저장소 이름이 명시되지 않은 이미지는 도커에서 기본적으로 제공하는 이미지 저장소인 도커 허브의 공식 이미지를 뜻한다.

- 이미지 이름: 해당 이미지가 어떤 역할을 하는지 나타낸다. (생략 불가)

- 태그: 이미지의 버전 관리 또는 리비전 관리에 사용한다. 태그를 생략하면 도커 엔진은 이미지의 태그를 latest로 인식한다.

ex) ted_repo/ubuntu:20.04

 

도커 컨테이너

· 앞서 설명한 이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되고, 이것이 도커 컨테이너가 된다. 

· 컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 컨테이너에서 무엇을 하든지 원래 이미지는 영향을 받지 않는다. 

· 생성된 각 컨테이너는 각기 독립된 파일시스템으로 제공받으며, 호스트와 분리되어 특정 컨테이너에서 어떤 애플리케이션을 설치하거나 삭제해도 다른 컨테이너와 호스트는 변화가 없다.

ex) 우분투 도커 이미지로 두 개의 컨테이너를 생성한 뒤 A 컨테이너에 MySQL, B 컨테이너에 Postgresql을 설치해도 각 컨테이너는 서로 영향 x

 

도커 컨테이너 다루기

도커 엔진 버전 확인

$ docker -v
Docker version 20.10.14, build a224086

 

도커 컨테이너 생성하기

$ docker run -i -t ubuntu:14.04

-i: 상호 입출력을 활성화

-t: tty 를 활성화해서 컨테이너가 배시 셸을 사용함

 

 

이렇게하면, ubuntu:14.04 이미지가 로컬 도커 엔진에 좋재하지 않으므로 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려받는다. 

 

다운로드가 완료되면, 다음과 같이 셸의 사용자와 호스트 이름이 변경된다. 이는 컨테이너 내부에 들어왔기 때문이다.

root@56093bb8ddc0:/#

컨테이너의 기본 사용자: root / 호스트 이름: 무작위 16진수 해시값

 

호스트와 컨테이너의 파일시스템이 서로 독립적이므로, 컨테이너에는 아무 것도 설치되지 않았다.

 

 

root@56093bb8ddc0:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

 

컨테이너 빠져나오기 - exit, Ctrl + D / Ctrl + P, Q

exit 명령을 사용하거나, Ctrl + D를 통해 컨테이너에서 빠져나올 수 있다. 동시에 컨테이너가 정지된다.

root@b7e4676e2fa7:/# exit
exit

Ctrl + P, Q를 입력하면 컨테이너를 정지하지 않고, 셸에서만 빠져나온다.

 

이미지 내려받기 - docker pull

$ docker pull centos:7

 

도커 엔진에 존재하는 이미지 목록 출력 - docker images

$ docker images
REPOSITORY        TAG                    IMAGE ID       CREATED         SIZE
centos            7                      eeb6ee3f44bd   12 months ago   204MB
ubuntu            14.04                  13b66b487594   18 months ago   197MB

 

컨테이너를 생성하고, 내부로 들어가는 또 다른 방법

컨테이너를 생성할 때 run 명령어가 아닌 create 명령어를 사용할 수도 있다.

$ docker create -i -t --name mycentos centos:7
4bd15b275bf2292dd11f5a9528f90dadf4bffe3181ec55c87fc1d588d3522f7d

 

run 명령어와 다르게 create 명령어는 컨테이너 내부로 들어가지 않는다. docker start 명령어로 컨테이너를 시작하고,

docker attach 명령어로 컨테이너 내부로 들어갈 수 있다.

$ docker start mycentos
mycentos

$ docker attach mycentos
[root@4bd15b275bf2 /]#

 

docker stop 명령어로 컨테이너를 종료할 수 있다.

$ docker stop mycentos
mycentos

 

* 컨테이너를 대상으로 하는 모든 명령어는 컨테이너 이름 대신 ID를 쓸 수 있다. 또한 앞의 2~3자만 입력해도 가능하다.

$ docker start 4bd15b275bf2
4bd15b275bf2

$ docker attach 4bd
[root@4bd15b275bf2 /]#

 

컨테이너 목록 확인 - docker ps

docker ps 명령어는 정지되지 않은 컨테이너를 출력한다.

$ docker ps
CONTAINER ID  IMAGE      COMMAND      CREATED       STATUS        PORTS    NAMES
4bd15b275bf2  centos:7   "/bin/bash"  39 hours ago  Up 3 minutes           mycentos

 

 

정지된 컨테이너를 포함한 모든 컨테이너를 출력하려면 -a 옵션을 추가한다.

$ docker ps
CONTAINER ID  IMAGE        COMMAND      CREATED       STATUS                    PORTS    NAMES
4bd15b275bf2  centos:7     "/bin/bash"  39 hours ago  Up 3 minutes                       mycentos
1f246dbc1355  ubuntu:14.04 "/bin/bash"  39 hours ago  Exited (255) 24 hours ago          quirky_dhawan
CONTAINER ID - 컨테이너의 자동으로 할당되는 고유한 ID
- 위 컨테이너 ID는 축약된 ID이고, docker inspect 명령어를 사용하면 전체 ID를 확인할 수 있다.
$ docker inspect mycentos | grep Id
"Id": "4bd15b275bf2292dd11f5a9528f90dadf4bffe3181ec55c87fc1d588d3522f7d",
IMAGE - 컨테이너를 생성할 때 사용된 이미지
COMMAND - 컨테이너가 시작될 때 실행될 명령어
- 대부분의 이미지에 미리 내장돼 있어 별도 설정할 필요는 없다.
- docker run 또는 create 명령 맨 끝에 입력하여, 내장된 커맨드를 덮어쓸 수 있다.
ex) docker run -i -t ubuntu:14.04 echo hello world!
위 명령은 컨테이너를 실행할 때 "hello world!"를 축력한다. 하지만 이미지에 내장된 커맨드인 /bin/bash를 덮어쓰므로 상호 입출력 가능한 셸이 실행되지 않고, 컨테이너가 종료된다.
CREATED - 컨테이너가 생성된 후 흐른 시간
STATUS - 컨테이너의 상태
Up: 실행 중 / Exited: 종료 / Pause: 일시 중지
PORTS - 컨테이너가 개방한 포트와 호스트에 연결한 포트
NAMES - 컨테이너의 고유한 이름
- 컨테이너 생성시 --name 옵션으로 이름을 설정하지 않으면, 도커 엔진이 임의로 형용사와 명사를 무작위로 조합해 이름을 설정한다.

 

컨테이너 삭제: docker rm

$ docker rm quirky_dhawan
quirky_dhawan

 

실행 중인 컨테이너는 삭제할 수 없으므로, 컨테이너를 종료한 후 삭제해야한다. 또는 rm 명령어에 -f 옵션을 추가하는 방법도 있다.

$ docker rm -f mycentos

 

prune 명령어를 사용하면 모든 컨테이너를 삭제할 수 있다.

$ docker container prune

 

docker ps 명령어에 -a 옵션과 -q 옵션을 조합하면 편리하게 컨테이너를 삭제할 수 있다. 다음 명령어는 컨테이너의 실행 상태와 관계 없이 모든 컨테이너를 정지하고 삭제한다.

$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)

-a 옵션: 컨테이너 상태와 관계 없이 모든 컨테이너 출력 / -q 옵션: 컨테이너 ID 출력

 

컨테이너 외부에 노출하기

 

컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받는다. 외부에 컨테이너를 노출하기 위해서는 컨테이너에 배정받은 IP와 포트를 호스트의 IP와 포트에 바인딩해야 한다.

 

다음 명령어를 통해 컨테이너를 생성한다.

$ docker run -i -t --name mywebserver -p 7777:80 ubuntu:14.04
root@37fed36efc8a:/#

 

-p는 포트포워딩 옵션이다. 컨테이너의 포트를 호스트의 포트와 바인딩해 연결한다. 7777:80와 같이 입력하면 호스트의 7777번 포트를 컨테이너의 80번 포트와 연결한다. 

 

컨테이너 내부에서 아파치 웹서버를 설치 및 실행한다.

 

root@37fed36efc8a:/# apt-get update
root@37fed36efc8a:/# apt-get install apache2 -y
root@37fed36efc8a:/# service apache2 start

 

[도커 엔진 호스트IP]:7777로 도커 컨테이너에 접속할 수 있다.

 

※ 추가설정

- 여러 개의 포트를 외부에 개방하려면 -p 옵션을 여러번 써 서 설정한다.

$ docker run -i -t --name mywebserver -p 7777:80 -p 3306:3306 ubuntu:14.04

- 호스트의 특정 IP를 사용하려면 바인딩할 IP와 포트를 함께 명시한다.

$ docker run -i -t --name mywebserver -p 192.168.0.100:7777:80 -p 3306:3306 ubuntu:14.04

 

컨테이너 애플리케이션 구축

- 서비스를 컨테이너화 할 때 여러 개의 애플리케이션을 한 컨테이너에 설치할 수도 있고, 컨테이너에 애플이케이션을 하나만 동식시킬 수도 있다.

- 컨테이너에 애플리키에션을 하나만 동작시키면 컨테이너 간의 독립성을 보장할 수 있고, 도커 이미지 관리도 편하며, 애플리케이션의 버전 관리와 소스코드 모듈화도 쉬워진다.

- 하나의 컨테이너에 프로세스 하나만 실행하는 게 도커의 철학이다. 따라서 도커 커뮤니티와 도커 공식 홈페이지에서는 이러한 방식을 권장한다.

 

워드프레스 기반 블로그 서비스를 컨테이너를 통해 구축하자. mysql 이미지를 사용해 데이터베이스 컨테이너를, wordpress 이미지를 통해 웹 서버 컨테이너를 생성한다.

$ docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql

$ docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress

-d 옵션으로 run을 실행하면 입출력이 없는 상태(Detached 모드)로 컨테이너를 실행한다. 즉, 컨테이너를 백그라운드에서 동작하는 애플리케이션으로 실행한다.

-e 옵션은 컨테이너 내부의 환경변수를 설정한다. 

 

올바르게 환경변수가 설정되었는지 확인하려면 echo 명령어를 사용하면된다. (해당 컨테이너가 Detached 모드이므로, 컨테이너 내부셸을 사용하기 위해 컨테이너 내부에 /bin/bash 프로세스를 먼저 실행한다)

$ docker exec -i -t wordpressdb /bin/bash
bash-4.4# echo $MYSQL_ROOT_PASSWORD
password

 

exec 명령어는 컨테이너 내부에서 명령어를 실행한 뒤 결괏값을 반환한다. 설정된 환경변수가 MYSQL에 사용됐는지 확인하기 위해 컨테이너 내부에서 mysql에 접속한다.

bash-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 8.0.30 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

--link 옵션은 내부 IP 없이 컨테이너 별명(alias)으로 접근하도록 설정한다. 위 설정을 통해 워드프레스 웝서버 컨테이너는 wordpressdb의 IP를 몰라도 mysql이라는 호스트명으로 접근 할 수 있다. (deprecated된 옵션으로 사용에 주의한다)

 

docker ps 명령어로 워드프레스 웹서버 컨테이너가 호스트의 어느 IP와 포트와 연결됐는지 확인한다.

CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS                  PORTS                     NAMES
9d3e43710f79   wordpress   "docker-entrypoint.s…"   About a minute ago   Up About a minute       0.0.0.0:58726->80/tcp     wordpress

 

58726 포트와 연결되어 있고, 0.0.0.0은 호스트의 활용 가능한 모든 네트워크 인터페이스에 바인딩함을 뜻한다. 웹브라우저로 [호스트 IP]:58726에 접근하면, 다음과 같이 워드프레스 어드민페이지로 이동한다.

 

출처

시작하세요! 도커/쿠버네티스

반응형

댓글