컨테이너 기반 가상화 플랫폼 '도커(Docker)'의 이해
포스팅 참조 정보
해당 포스팅 참고 토크ON세미나 강의 링크
https://www.youtube.com/playlist?list=PLinIyjMcdO2S_Ojp_qK7EaZpxr3M3xprT
https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=125
실습 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
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/
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의 거의 모든 기능을 사용할 수 있음
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 3. 쿠버네티스 들어가기 (0) | 2020.08.22 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 2. 쿠버네티스 소개 (0) | 2020.08.18 |
[데브옵스를 위한 쿠버네티스 마스터] 1. Docker 요약 정리 (0) | 2020.08.17 |
[도커(Docker)의 이해] 4. 이미지 빌드 환경 만들기 (0) | 2019.10.07 |
[도커(Docker)의 이해] 3. 이미지 만들고 배포하기 (0) | 2019.10.07 |
댓글