개발강의정리/DevOps

[도커(Docker)의 이해] 2. 컨테이너 실행하기

nineDeveloper 2019. 10. 7.
728x90

컨테이너 기반 가상화 플랫폼 '도커(Docker)'의 이해

포스팅 참조 정보

해당 포스팅 참고 토크ON세미나 강의 링크

https://www.youtube.com/playlist?list=PLinIyjMcdO2S_Ojp_qK7EaZpxr3M3xprT

 

Docker의 이해 - YouTube

 

www.youtube.com

https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=125

 

컨테이너 기반 가상화 플랫폼 ‘도커(Doker)’의 이해 | T아카데미 온라인강의

본 강의는 2018.1.17(수)에 진행된 제19차 토크ON세미나 동영상입니다. 도커는 빠르게 인기를 얻고 있는 컨테이너 기반의 오픈소스 가상화 플랫폼으로 개발과 테스트,..

tacademy.skplanet.com

실습 Version 정보

  • Ubuntu 18.04
  • Docker Version: 19.03.2

2강 컨테이너 실행하기

도커 설치하기

명령어를 입력하고 패스워드를 넣으면 리눅스 배포판(ubuntu/centos/..)에 따라 자동으로 최신버전의 도커를 설치

$ curl -s https://get.docker.com/ | sudo sh

도커 그룹 추가

$ cat /etc/group
$ sudo usermod -aG docker $USER
$ sudo service docker restart

도커 파일

https://www.youtube.com/watch?v=_lM9uotAOmk

https://jaystevency.tistory.com/20

 

[Docker] #1 Docker를 이용해 나만의 서버 환경 구성하기

Docker 실습 환경 Dev OS : Mac OS Sierra Terminal : iTerm 본 포스팅은 Docker networking 설정으로 Docker 컨테이너(?) 끼리 네트워크 환경을 구성합니다. 기본적인 Docker의 활용은 박재성님의 Docker 유튜브..

jaystevency.tistory.com

FROM 1and1internet/ubuntu-16-nginx

RUN apt-get update

RUN apt-get install -y language-pack-ko

# set locale ko_KR
RUN locale-gen ko_KR.UTF-8

ENV LANG ko_KR.UTF-8
ENV LANGUAGE ko_KR.UTF-8
ENV LC_ALL ko_KR.UTF-8

RUN apt-get install -y \
        vim \
        iputils-ping \
        net-tools

CMD /bin/bash

필수 패키지 설치

apt-get update
apt-get install netcat

도커 컨테이너와 내부 다른 도커 컨테이너 통신 리눅스설정

https://biancatamayo.me/blog/2017/11/03/docker-add-host-ip/

 

Two simple, quick ways to access docker host container IP from inside a container

Last updated: April 6, 2019 Last tested with version Docker version 18.09.3 on Ubuntu 16.04, Debian 9 (stretch), macOS Mojave (10.14.4). Sometimes you need to be able to connect to the host network from inside a Docker container. Could be for debugging, or

biancatamayo.me

HOST_IP=`ip -4 addr show scope global dev docker0 | grep inet | awk '{print \$2}' | cut -d / -f 1`
docker run --add-host outside:$HOST_IP --name busybox -it busybox /bin/sh
$ cat /etc/hosts

127.0.0.1    localhost  
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet  
ff00::0    ip6-mcastprefix  
ff02::1    ip6-allnodes  
ff02::2    ip6-allrouters  
172.17.0.1    outside <---- THIS ONE!  
172.17.0.3    a8300156a695  

도커 옵션

  • -d: detached mode 흔히 말하는 백그라운도 모드
  • -p: 호스트와 컨테이너의 포트를 연결(포워딩)
  • -v: 호스트와 컨테이너의 디렉토리를 연결(마운트)
  • -e: 컨테이너 내에서 사용할 환경변수 설정
  • --name: 컨테이너 이름 설정
  • --rm: 프로세스 종료시 컨테이너 자동 제거
  • -it: -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
  • --network: 네트워크 연결

ubuntu 설치만하기

$ docker run ubuntu:latest

ubuntu 설치하면서 이미지 /bin/sh로 터미널 접속

$ docker run --rm -it ubuntu:latest /bin/sh

Web Application v2

호스트 포트를 4568로 바꾸고 2번 태그 이미지를 사용함
-e옵션으로 환경변수를 설정해 주었음
PARAM_NAME에 본인의 이름이나 별명을 입력

이미지를 접속할 경우 접속기록을 남김
https://workshop-docker-kr.herokuapp.com

불러오는 중입니다...
docker run -d \
  -p 4568:4567 \
  -e ENDPOINT=https://workshop-docker-kr.herokuapp.com/ \
  -e PARAM_NAME=freelife \
  subicura/docker-workshop-app:2

Web Application v3

PARAM_MESSAGE환경변수를 추가하고 이미지는 3번 태그를 사용함
메세지를 남길 수 있음

docker run -d \
  -p 4569:4567 \
  -e ENDPOINT=https://workshop-docker-kr.herokuapp.com/ \
  -e PARAM_NAME=freelife \
  -e PARAM_MESSAGE=슈퍼개발자 \
  subicura/docker-workshop-app:3

Redis

레디스 설치

$ docker run --add-host outside:$HOST_IP --name=redis -d -p 1234:6379 redis

telnet 프로그램으로 테스트
Linux 에서는 그냥 진행하면되고 Mac 이나 Windows는 아래의 내용을 진행

# mac
$ docker run --rm -it mikesplain/telnet docker.for.mac.localhost 1234
# windows
$ docker run --rm -it mikesplain/telnet docker.for.win.localhost 1234

$ docker run --rm -it mikesplain/telnet host.docker.internal 1234
$ docker run --rm -it --add-host outside:$HOST_IP mikesplain/telnet outside 1234

set hello world
+OK
get hello
$5
world
quit

MySQL

어떤 옵션(환경변수)이 있는지 확인

docker run -d -p 3306:3306 \
  --add-host outside:$HOST_IP \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

mysql에 접속하여 database 만들기

docker exec -it mysql mysql

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

exec

exec명령어는 run명령어와 달리 실행중인 도커 컨테이너에 접속할 때 사용하며
일반적으로 컨테이너 안에 ssh server등을 설치하지 않고 exec명령어로 접속

Wordpress

워드프레스 실행

# windows 사용자는 docker.for.mac.localhost 대신 docker.for.win.localhost를 입력
docker run -d -p 8080:80 \
  --add-host outside:$HOST_IP \
  -e WORDPRESS_DB_HOST=outside \
  -e WORDPRESS_DB_NAME=wp \
  -e WORDPRESS_DB_USER=wp \
  -e WORDPRESS_DB_PASSWORD=wp \
  wordpress

Tensorflow

tensorflow 실행 손쉽게 머신러닝을 할 수 있는 툴

$ docker run -it -p 8888:8888 tensorflow/tensorflow

logs

컨테이너가 정상적으로 동작하는지 로그를 확인

  • -f: 실시간 로그 확인
  • --tail: 뒷부분 로그 확인
$ docker logs  $CONTAINER

pull

이미지를 다운로드 하는 명령어

$ docker pull ubuntu:latest

run 명령어를 입력하면 이미지가 없을 때 자동으로 다운받으니 pull명령어를 언제 쓰는지 궁금할 수 있는데
pull은 최신버전으로 다시 다운 받음
같은 태그지만 이미지가 업데이트 된 경우에는 pull 명령어를 통해 새로 다운받을 수 있음

network create

도커 컨테이너끼리 통신을 할 수 있는 가상 네트워크를 만듬

$ docker network create NETWORK

app-network라는 이름으로 wordpress와 mysql이 통신할 네트워크를 만듬

$ docker network create app-network

생성된 app-network 연결해서 컨테이너 실행

$ docker run -d --name=ubuntu -it --network=app-network ubuntu:latest /bin/sh

ubuntu2 라는 동일한 컨테이너 생성

$ docker run --name=ubuntu2 -it --network=app-network ubuntu:latest /bin/sh

network connect

기존에 생성된 컨테이너에 네트워크를 추가

$ docker network connect NETWORK $CONTAINER

만들어 놓은 mysql에 네트워크를 추가

$ docker network connect app-network mysql

run with network

워드프레스를 app-network에 속하게 생성하고 mysql을 IP가 아닌 mysql로 바로 접근

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

같은 네트워크에 속해 있으면 상대 컨테이너의 이름을 DNS로 조회하여 바로 접근할 수 있음
하나의 컨테이너는 여러개의 network에 속할 수 있으며 Docker Swarm같은 클러스터에서 편리하게 사용할 수 있음

볼륨 마운트 (-v)

mysql을 삭제후에 다시 실행

$ docker stop mysql
$ docker rm mysql
$ docker run -d -p 3306:3306 \
    -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
    --network=app-network \
    --name mysql \
    mysql:5.7

워드프레스를 접속하면 데이터베이스 오류가 발생함
이전 데이터가 전부 초기화 됨

Docker Compose

Docker for Mac / Windows는 기본으로 같이 설치됨

$ docker-compose --version

Linux에 설치하는 명령어

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

업그레이드

$ docker-compose migrate-to-labels

삭제

$ sudo rm /usr/local/bin/docker-compose

docker-compose.yml

볼륨 마운트 옵션을 넣어서 wordpress와 database를 만듬

version: '2'

services:
  db:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    image: wordpress:latest
    volumes:
      - ./wp:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

up

docker compse를 이용하여 mysql와 wordpress를 실행

$ docker-compose up -d
  • -f: 기본 docker-compose.yml 파일을 찾지만 -f 옵션의 파일을 찾음
$ docker-compose -f test.yml up

down

docker compose를 이용하여 mysql와 wordpress를 종료

$ docker-compose down

Docker Compose

실제 운영환경에선 명령어를 입력하는 대신 대부분 Docker Compose를 사용함
Docker Compose는 docker의 거의 모든 기능을 사용할 수 있음

728x90

댓글

💲 추천 글