Docker 정리 #2 (분리된 어플리케이션 컨테이너 만들기)

Posted by Jungwoon Blog on January 13, 2019

Docker 정리 #2

최근에 쿠버네티스를 공부할 일이 있어서 보고 있는데, 쿠버네티스 자체가 도커(Docker) 오케스트레이션을 해주는 툴이라 도커에 대한 개념이 없으니, 공부하기가 힘들었습니다. 그래서 이렇게 급하게 책을 사서 공부하면서 내용을 정리하고자 합니다.

해당 내용은 위키북스에서 나온 시작하세요! 도커 책을 보면서 정리한 내용입니다. 책의 내용이 매우 좋아서 강추합니다.

예를 들어서 웹 서버와 데이터베이스 서버를 컨테이너로 구성한다고 할때 아래와 같이 구성할 수 있습니다.

  1. 하나의 컨테이너에 웹 서버 + 데이터베이스 서버
  2. 웹 서버 컨테이너 + 데이터베이스 컨테이너

두 가지 방법 모두 가능하나 도커에서는 2번 방법을 더 권장합니다. 개별적으로 동작시킴으로써 독립성을 유지하기가 쉽기 때문입니다.

여기서는 MySQL과 Wordpress 컨테이너를 개별적으로 구축하여 연결하는 실습을 해보도록 하겠습니다.


실습

먼저 MySQL 컨테이너부터 만들어 보도록 하겠습니다.

$ docker run -d \               # -d : 컨테이너를 백그라운드에서 동작하는 어플리케이션으로 실행하도록 합니다.
> --name wordpressdb \          # --name : 컨테이너 이름설정으로 이름은 wordpressdb로 설정하였습니다.
> -e MYSQL_DATABASE=wordpress \ # -e : 환경변수 설정으로, DATABASE 이름을 wordpress로 설정하였습니다.
> -e MYSQL_ROOT_PASSWORD=test \ # -e : 환경변수 설정으로, root 패스워드를 test로 설정하였습니다.
> mysql:5.7                     # 데몬 형태의 mysql 이미지를 이용합니다.

Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
177e7ef0df69: Pull complete
cac25352c4c8: Pull complete
8585afabb40a: Pull complete
1e4af4996053: Pull complete
c326522894da: Pull complete
9020d6b6b171: Pull complete
55eb37ec6e5f: Pull complete
1a9d2f77e0e7: Pull complete
d7e648ad64aa: Pull complete
4120d828ea6b: Pull complete
3b39dc5451af: Pull complete
Digest: sha256:bf17a7109057494c45fba5aab7fc805ca00ac1eef638dfdd42b38d5a7190c9bb
Status: Downloaded newer image for mysql:5.7
6db03c50f95a5b853080f2c55cce73873958ede7f3a34b45a03038cc5bec4ec4

그 다음 wordpress 컨테이너를 만들어 보도록 하겠습니다.

$ docker run -d \                 # -d : 컨테이너를 백그라운드에서 동작하는 어플리케이션으로 실행하도록 합니다.
> --name wordpress \              # --name : 컨테이너 이름설정으로 이름은 wordpress로 설정하였습니다.
> -e WORDPRESS_DB_PASSWORD=test \ # -e : 환경변수 설정으로, wordpress의 DB 패스워드를 test로 설정하였습니다.
> --link wordpressdb:mysql \      # --link : wordpressdb 컨테이너를 mysql라는 이름으로 접근하겠다고 설정
> -p 80 \                         # -p : 80 번 포트를 포트 포워딩 하겠다는 의미입니다.
> wordpress                       # wordpress 이미지를 사용합니다.

Unable to find image 'wordpress:latest' locally
latest: Pulling from library/wordpress
177e7ef0df69: Already exists
9bf89f2eda24: Pull complete
350207dcf1b7: Pull complete
a8a33d96b4e7: Pull complete
c0421d5b63d6: Pull complete
f76e300fbe72: Pull complete
af9ff1b9ce5b: Pull complete
d9f072d61771: Pull complete
2a25fcb23d18: Pull complete
0e496ab19dff: Pull complete
2a5d39fc92ab: Pull complete
8603dc5a76e7: Pull complete
4525497200a2: Pull complete
df66f65de27a: Pull complete
92e4ef3b2ffe: Pull complete
25cd0a2082a9: Pull complete
f92934de0950: Pull complete
cdbdef416450: Pull complete
fa3c788dd92b: Pull complete
Digest: sha256:13e2b0e804fbe5250f3b8e0bfb2c2252d215c1da780ac2bf43b7797c0806b50c
Status: Downloaded newer image for wordpress:latest
16c3b440c66d7052136742d30b6cc173dea037b531b86b906c54ac43c8dc1e85

잘 만들어졌는지 확인을 위해서 아래 명령어로 확인해 보겠습니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
16c3b440c66d        wordpress           "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        0.0.0.0:32768->80/tcp   wordpress
6db03c50f95a        mysql:5.7           "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       3306/tcp, 33060/tcp     wordpressdb
aab67382350b        ubuntu:14.04        "/bin/bash"              About an hour ago   Up About an hour    0.0.0.0:80->80/tcp      mywebserver

위에서 wordpress 컨테이너 생성시 -p 옵션에서 [호스트 포트]를 따로 지정하지 않았기 때문에, 임의로 정해졌는데 32768로 연결이 되었습니다. 잘 설치가 되었는지 확인을 위해서 웹브라우저에서 localhost:32768로 워드프레스가 잘 뜨는지 확인해보도록 하겠습니다.

확인해보니 아래 와 같이 잘 뜬걸 확인할 수 있습니다.

새로 사용한 옵션들에 대해서 좀 더 자세히 알아보도록 하겠습니다.

  • -d
    • Detached 모드로 백그라운드에서 동작하는 어플리케이션으로써 실행합니다.
    • Detached 모드이기때문에 attach 명령어로 접근할 수 없습니다.
    • 백그라운드에 프로그램이 실행되지 않으면 컨테이너는 종료됩니다. (위에서는 mysql or wordpress)
    • 쉘을 사용하려면 exec 명령어를 사용해야 합니다. ex) $ docker exec -i -t wordpressdb /bin/bash
  • --link
    • 내부 IP를 알 필요 없이 항상 컨테이너에 별명으로 접근합니다.
    • 다음과 같이 사용합니다 $ docker --link [컨테이너 이름]:[별명]
    • --link 명령어를 사용할때 해당 컨테이너가 실행중이 아니라면 에러가 납니다.