IT,프로그래밍/Devops

[도커 노트 #2] 컨테이너 사용해보기

이전글 먼저 보기

 

도커란?

burning-camp.tistory.com/56

 


도커 사용하기

도커는 하나의 실행파일이지만 실제로는 서버와 클라이언트 역할을 각각할수 있습니다.

 

무슨 말이냐면 커멘트를 입력하면 도커 커맨드를 도커 클라이언트가 도커 서버로 전송하고 결과를 받아서 출력을 해줍니다.

컨테이너 실행하기

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

먼저 우분투 컨테이너를 생성하고 해당 컨테이너 내부에 들어가 보겠습니다.

docker run ubuntu:16.04

이 경우 아무런 반응이 없는것 처럼 보입니다.

 

그것은 실행이 되었지만 해당 컨테이너에 실행을 하라는 명령어를 전달하지 않았기 때문에 생성과 동시에 종료 됩니다.

 

여기서 중요한점이 컨테이너는 결국에 프로세스기 때문에 실행중인 프로세스가 없다면 컨테이너는 종료됩니다.

 

그럼 이번에는 명령어를 다소 바꿔보겠습니다.

docker run --rm -it ubuntu:16.04 /bin/bash

--rm 옵션으로 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 합니다

-it 옵션은 아래의 2가지가 합쳐져 있다.

 

  • i : Interactive 모드로 표준입력과 표준출력을 키보드와 화면을 통해 가능하도록 하는 옵션이다.
  • t: 텍스트 기반의 터미널(TTY)을 애뮬레이션해주는 옵션이다.

즉, i 옵션으로 키보드와 화면을 통해 입출력이 되고, t옵션으로 TTY을 에뮬레이터 해서 우리가 터미널을 통해 입력할수 있도록 만들어 주는것이다.

 

/bin/bash 명령어를 이용해서 우분투 컨테이너를 실행시켜보자

Redis container 실행해보기

redis는 6379 port로 통신합니다.

 

detached mode(background mode)을 위해서 -d 옵션을 추가하고 포트 포워딩을 위해 -p옵션을 추가 해보겠습니다

docker run -d -p 1234:6379 redis

위의 명령어를 통해서 redis 컨테이너가 1234의 포트가 6379포트와 연결이 되었습니다.

백그라운드에서 redis가 정상적으로 실행중인지 확인해봅시다.

 

-d 옵션으로 backgound 에서 잘 실행이 되고 있는지 docker ps를 이용해서 현재 실행중인 redis container를 확인할수 있습니다.

# docker ps               

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
8715514417ff        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:1234->6379/tcp   cranky_pasteur

이제 redis에 telnet을 이용해서 테스트를 해보겠습니다.

Mac OS에서 High Sierra이후 telnet이 기본제공되지 않기 떄문에

homebrew를 이용해서 telnet설치하겠습니다.

brew tap theeternalsw0rd/telnet

brew install telnet

telnet localhost 1234

아까 host의 1234포트를 컨테이너의 6379와 연결( 1234:6379) 로 연결했기에 local 1234포트로 접속하면 redis를 사용할수 있습니다.

 

redis에 접속을한다음에

set mykey hello
+OK
get mykey
$5
hello

reids 명령어를 실행해보면 잘 실행되는것을 볼수있습니다.

 

빠져나올때는 quit명령어를 사용하면 redis에서 나올수 있습니다.

 

호스트의 post만 다르게 해주면 하나의 서버에 여러개의 redis 서버를 띄우는게 가능합니다.

Mysql container 실행하기

-e 옵션으로 환경변수를 설정하고 --name을 이용해서 컨테이너에 이름을 부여해볼겁니다.

docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7
  • -d 로 백그라운드 실행을 해줍니다
  • -p 로 host port 중 3306을 컨테이너의 3306과 연결해줍니다
  • -e 로 환경설정을 해주는데, MYSQL_ALLOW_EMPTY_PASSWORD는 패스워드 없이 root 계정을 만들어 주기 위해 사용합니다.
  • --name 으로 container의 name 을 mysql로 변경해 줍니다.
mysql -h127.0.0.1 -uroot

위의 명령어로 mysql이 잘 동작하고 있다는것을 알수 있습니다.

Wordpress container 와 mysql contatiner 연결하기

wordpress container와 위에서 만들어둔 mysql container와 연결을 해보겠습니다

예제에서는 --link를 사용했지만 지금은 docker 공식 documation에서 보면 나와있지만 곧 사라질 예정이라

Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environment variables between containers. However, you can use other mechanisms such as volumes to share environment variables between containers in a more controlled way.

See Differences between user-defined bridges and the default bridge for some alternatives to using --link.

docker network를 사용해서 바꿔보는것 까지 해보겠습니다.

 

 

--link 옵션은 컨테이너의 IP정보를 /etc/host에 자동입력 함으로 워드프레스 컨테이너가 mysql 데이터 베이스의 정보를 알 수 있게됩니다.

 

mysql -h127.0.0.1 -uroot
create database wp CHARACTER SET utf8;
grant all privileges on wp.* to wp@'%' identified by 'wp';
flush privileges;
quit

먼저 이번 예제에서 사용할 mysql에서 wp database를 생성합니다.

 

이제 wordpress 를 실행합니다.

 

docker run -d -p 8080:80 \
  --link mysql:mysql \
  -e WORDPRESS_DB_HOST=mysql \
  -e WORDPRESS_DB_NAME=wp \
  -e WORDPRESS_DB_USER=wp \
  -e WORDPRESS_DB_PASSWORD=wp \
  wordpress

host 의 8080포트를 컨테이너의 80포트와 연결 시켜줍니다.

 

docker run 명령에서 연결 옵션은 --link <컨테이너 이름>:<별칭> 입니다

 

이후 데이터베이스 정보를 -e를 이용해서 환경변수로 입력합니다

 

이제 브라우저에서 위에서 설정을 해준대로 http://localhost:8080/ 로 접속해 보면 wordpress가 성공적으로 실행되는것을 확인할수 있습니다

 

하지만 --link 명령어는 없어지므로 다음글에서 network로 바꿔 보도록 해보곘습니다