컨테이너 생성을 위해서는 이를 위한 이미지가 필요하다. 이미지는 정적인 파일이며 수정이 된다면 수정된 이미지를 이용한 모든 컨테이너는 변경된 내용이 반영된 상태에서 배포된다.
컨테이너는 이미지로 부터 받은 내용을 토대로 생성되고 추가된 내용은 영구적으로 보관되지 않는다. 영구적인 보관이 필요하다면 별도의 volume 을 이용하여 데이터를 보관할 수 있다.
step0. 이미지는 동일 IP 주소에서는 하루에 100개 정도 받을 수 있다. 계정별로 100개 받고 싶다면 인증정보를 통해 접근해야 한다. 또한 로컬에 우리가 만들어 둔 이미지를 public registry에 push 하기 위해서도 인증정보가 필요하다.
로그인 방법
step1. 퍼블릭에 있는 이미지를 로컬 레지스트리로 pull 해야 한다.
step2. centos7 컨테이너에 배포하기
step3. 접속된 컨테이너에서 나가기
1. exit: container 종료하며 나감
동작중인 container 확인. 현재 X
container list 확인
docker start, 접속
step4) nginx 이미지 다운로드 하기
docker pull nginx #docker hub에 있는 nginx 최신 이미지를 로컬 저장소에 pull 한다
docker image ls # image list 확인. nignx 추가 되어 있다.
step5) nginx 배포하기
docker container run -d --name nginx01 -p 8001:80 nginx
step6) httpd 실행하기
docker container run -d --name httpd01 -p 8002:80 httpd
rapa@rapa:~$ docker container exec httpd01 env # 외부 연결용 인터페이스가 없는 경우 외부 클라이언트에서 컨테이너에게 명령을 전달하고 결과를 외부에서 받을 수 있다.
PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=39f1426f7351
HTTPD_PREFIX=/usr/local/apache2
HTTPD_VERSION=2.4.54
HTTPD_SHA256=eb397feeefccaf254f8d45de3768d9d68e8e73851c49afd5b7176d1ecf80c340
HTTPD_PATCHES=
HOME=/root
결국 exec를 사용하면 컨테이너 내부로 직접 들어가지 않아오 컨테이너의 명령을 외부에서 전달할 수 있다.
Quiz) httpd를 이용하여 추가 웹서버를 실행해 보세요.
docker container run -d --name httpd02 -p 8003:80 httpd
docker image life cycle
이미지를 만드는 방법
데이터베이스를 사용하는 방법
Quiz) mysql 배포하기
root password = test123
기본 데이터베이스 = testdb
외부에 공개할 포트 = 기본적으로 컨테이너는 3306/tcp를 이용하여 외부에 노출된다. 우리는 호스트의 33061번 포트를 통해 해당 DB로 접근할 수 있어야 한다.
컨테이너의 이름은 mydb로 한다.
컨테이너가 만들어 졌다면
우분투에서는 sudo apt -y install mysql-client-core-8.0 로 설치한 뒤 접속해 본다.
Answer)
rapa@rapa:~$ docker container run -it -d --name mydb -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=testdb -p 33061:3306 -v /home/rapa/mydb:/var/lib/mysql --restart=always mysql:5.7
rapa@rapa:~$ mysql -u root -P 33061 -h 127.0.0.1 -p # 접속
rapa@rapa:~$ docker create volume testvol1 # 볼륨 생성
rapa@rapa:~$ docker container run -it --name centos01 -v testvol1:/root centos:7 /bin/bash #컨테이너 생성하며 볼륨 연결
위와 같이 호스트에 있는 여유공간을 사용할 수 있다. 만약 볼륨의 크기를 지정하여 사용하고 싶다면 외부 플러그인을 활용해야 한
rapa@rapa:~$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eff02c1008f5 centos:7 "/bin/bash" 4 minutes ago Exited (0) 14 seconds ago centos01
rapa@rapa:~$
rapa@rapa:~$ docker volume ls
DRIVER VOLUME NAME
local testvol1
rapa@rapa:~$ docker container rm centos01
centos01
rapa@rapa:~$ docker volume ls
DRIVER VOLUME NAME
local testvol1
rapa@rapa:~$
컨테이너를 삭제하더라도 볼륨은 여전히 남아있다.
rapa@rapa:~$ docker container run -it --name centos02 -v testvol1:/root centos:7 /bin/bash
기존 볼륨을 새로운 컨테이너인 centos02 에 연결하여 생성함.
[root@d3399448fda2 /]# ls /root/
anaconda-ks.cfg test.txt
기존 컨테이너에서 생성했던 파일을 여전히 볼 수 있다.
실제환경에서는 php 설치, apache 설치, maraidb(mysql) 설치, wordpress 소스코드가 필요하다. 하지만 컨테이너를 이용하게 되면 이를 두개의 컨테이너에 구성할 수 있다.
rapa@rapa:~$ docker container run -d --name wpdb -v wpdbvol:/var/lib/mysql --restart=always -e MYSQL_ROOT_PASSWORD=test123 -e MYSQL_DATABASE=wordpress mysql:5.7
b68042a09ecdb2ed2370f331d34b9e3d204630a285002b1c2d51e04d0f6e7326
rapa@rapa:~$ docker volume ls
DRIVER VOLUME NAME
local testvol1
local wpdbvol
rapa@rapa:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b68042a09ecd mysql:5.7 "docker-entrypoint.s…" 19 seconds ago Up 16 seconds 3306/tcp, 33060/tcp wpdb
f3169a4a9f69 centos:7 "/bin/bash" 23 minutes ago Up 22 minutes centos03
99ca440109dc centos:7 "/bin/bash" 41 minutes ago Up 41 minutes centos02
rapa@rapa:~$ docker container run -d --restart=always -p 8080:80 --name wp -e WORDPRESS_DB_PASSWORD=test123 -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=root --link wpdb:mysql -v wpvol:/var/www/html wordpress
7e869114abb8a1f0e79f03b4fa951b9f033c9f474f1fcf43a648731259827866
rapa@rapa:~$ ip a # ip 확인
결과
Reference: https://www.educative.io/answers/what-is-the-docker-container-lifecycle