docker 실습 - 컨테이너 생성, volume 연결, wordpress 구축

Hoon·2022년 8월 18일
0

Docker

목록 보기
3/13

실습에 앞서

컨테이너 생성을 위해서는 이를 위한 이미지가 필요하다. 이미지는 정적인 파일이며 수정이 된다면 수정된 이미지를 이용한 모든 컨테이너는 변경된 내용이 반영된 상태에서 배포된다.
컨테이너는 이미지로 부터 받은 내용을 토대로 생성되고 추가된 내용은 영구적으로 보관되지 않는다. 영구적인 보관이 필요하다면 별도의 volume 을 이용하여 데이터를 보관할 수 있다.

컨테이너의 종류

  1. os 컨테이너(centOS, ubuntu, ...)
  • entOS 컨테이너를 만들고 그 안에 web이나 db를 구축
  1. 애플리케이션 컨테이너(httpd, node, python, ...)
  • 컨테이너가 httpd, node 자체

이미지로부터 컨테이너를 생성하는 과정

process

  1. docker container run --name httpd01 .... httpd (명령어 입력)
  2. 로컬에 httpd 이미지가 있는지 여부를 확인하고 없다면 public registry 로 접속하여 httpd 최신 버전을 로컬 레지스트리로 다운로드 한다.
  3. 로컬 레지스트리에 저장된 이미지를 이용하여 컨테이너 생성
  4. 생성된 컨테이너를 실행

step0. 이미지는 동일 IP 주소에서는 하루에 100개 정도 받을 수 있다. 계정별로 100개 받고 싶다면 인증정보를 통해 접근해야 한다. 또한 로컬에 우리가 만들어 둔 이미지를 public registry에 push 하기 위해서도 인증정보가 필요하다.

https://hub.docker.com/

로그인 방법

  1. username, pw ← 비밀번호가 남으므로 보안상 좋지 않다.
  2. username, token
    • account settings → security → new access token → generate → copy

      - cat /home/rapa/.docker/config.json
      auth가 인증 키

step1. 퍼블릭에 있는 이미지를 로컬 레지스트리로 pull 해야 한다.

step2. centos7 컨테이너에 배포하기

step3. 접속된 컨테이너에서 나가기
1. exit: container 종료하며 나감

동작중인 container 확인. 현재 X


container list 확인

docker start, 접속

  1. ctrl+p, ctrl+q: 컨테이너를 종료하지 않고 나감.

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
  • run: create & start
  • -d: Run container in background and print container ID
  • -p 8001:80 <- 8001:host의포트, 80:컨테이너의 포트

step6) httpd 실행하기

docker container run -d --name httpd01 -p 8002:80 httpd
  • process
  1. 로컬 저장소에 이미지가 있는지 확인한다. 없다.
  2. 도커 허브에 접속하여 httpd:lastest를 찾고 이를 pull한다
  3. 로컬에 pull 된 이미지를 이용하여 이름 httpd01인 컨테이너를 생성한다. 이때 ubuntu 호스트인 8002 포트를 컨테이너 80번 포트를 자동으로 매핑해 준다.
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

이미지를 만드는 방법

  1. 동작중인 컨테이너를 commit 하여 이미지로 만든다
  2. Dockerfile을 이용하여 베이스이미지 지정, 추가 패키지 선택, 컨테이너로 동작시 실행할 명령어등을 지정한 뒤 이를 build 하면 로컬 저장소에 이미지가 생성된다.

데이터베이스를 사용하는 방법

  1. 서버를 준비한다 -> OS를 설치한다 -> mysql을 설치한다. <- bare metal
  2. AWS에 가서 RDS 서비스를 신청한다. (OS는 amazonelinux로 제공된다. 단, OS로 접근은 되지 않는다) 애플리케이션의 설치과정 없이 신청 즉시 해당 애플리케이션으로 접속할 수 있는 서비스 -> 완전관리형 서비스
  3. 도커를 이용하여 신청한다. 즉시 제공한다. 만약 모든 개발자들이 동일 버전의 개발환경이 필요하다면 컨테이너를 이용한 개발이 유용하다.

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 # 접속

docker volume 연결

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 소스코드가 필요하다. 하지만 컨테이너를 이용하게 되면 이를 두개의 컨테이너에 구성할 수 있다.

  1. Mysql 이미지 -> 배포 -> DB 컨테이너
  2. wordpress 이미지 -> 배포 -> WP 컨테이너
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

0개의 댓글