02-도커 엔진

런던행·2021년 8월 18일
0

Docker

목록 보기
1/1

위키북스 도커/쿠버네티스 책을 공부하면서 작성한 글입니다.

도커이미지와 컨테이너

도커 엔진에서 사용하는 기본 단위는 이미지와 컨테이너

도커 이미지

이미지는 컨테이너를 생성할 때 필요한 요소입니다. 도커에서 사용하는 이미지의 이름은 기본적으로 [저장소 이름]/[이미지이름]:[태그]의 형태로 구성됩니다.
alicer106/ubuntu:14.04

2.2 도커 컨테이너 다루기

2.2.1 컨테이너 생성

docker run -i -t ubuntu:14.04
docker run 명령어는 컨테이너를 생성하고 실행하는 역할을 합니다 ubuntu14.04는 컨테이너를 생성하기 위한 이미지의 이름이며, -i -t 옵션은 컨테이너와 상호 입출력을 가능하게 합니다.

컨테이너 내부에서 빠져나오는 방법(컨테이너 정지)

  • 쉘에서 exit 입력
  • Ctrl + D를 동시에 입력

컨테이너 내부에서 빠져나오는 방법(컨테이너 정지하지 않고)

  • Ctrl + P, Q

docker pull centos:7
centos7 이미지를 내려 받습니다.

docker images
이미지 목록을 출력합니다.

docker create -i -t --name centos7_2 centos:7
run 명령어가 아닌 create명령어를 사용할 수도 있습니다. 다음 명령얼르 입력해 centos:7 이미지로 컨테이너를 생성합니다. run 명령어와 달리 컨테이너 내부로 들어가지 않습니다.

$ docker start centos7_2
centos7_2
$ docker attach centos7_2
[root@fae7dcc61868 /]# 

docker start 명령어와 docker attach 명령어를 사용하여 컨테이너를 시작하고 내부로 들어갑니다.

run 명령어
docker pull -> docker create -> docker start -> docker attach

create 명령어
docker pull -> docker create

2.2.2 컨테이너 목록확인

docker ps
docker ps 명령어는 정지되지 않는 컨테이너만 출력합니다. 정지된 컨테이너를 포함한 모든 컨테이너를 출력하려면 -a 옵션을 추가합니다.
docker ps -a

2.2.3 컨테이너 삭제

docker rm name

2.2.4 컨테이너를 외부에 노출

docker run -i -t --name network_test ubuntu:14.04

root@7aa62fd27e29:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03  
          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:516 (516.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          

아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없습니다. 외부 노출되게 웹서버 컨테이너를 생성합니다.

docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04

2.2.5 컨테이너 애플리케이션 구축

데이터베이스와 웹 서버 컨테이너를 구분하는 편이 도커 이미지를 관리하고 컴포넌트의 독립성을 유지하기가 쉽습니다. 이 같은 구조는 여러 도커 커뮤니티뿐 아니라 도커 공식 홈페이지에서 권장하는 구조입니다.
데이터베이스와 워드프레스 웹 서버 컨테이너를 연동ㅎ 워드프레스 기반 블로그 서비스를 만들어 봅시다.

데이터베이스 컨테이너 생성

docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7

워드프레스 웹 서버 컨테이너 생성

docker run -d -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password --name wordpress --link wordpressdb:mysql -p 80 wordpress

데이터베이스와 웹서버 컨테이너가 생성되었으면 잘 되는지 워드프레스 웹사이트 접속합니다.
http://127.0.0.1:63756/

run -d 옵션

docker run -d --name detach_teat ubuntu:14.04

-d 옵션으로 실행하면 입출력이 없는 상태로 컨테이너를 실행합니다. 컨테이너 내부에서 프로그램이 터미널을 차지하는 포그라운드로 실행되 사용자의 입력을 받지 않습니다. 컨테이너 내부에서 프로그램을 시행하지 않는 채로 -d 옵션을 사용하면 컨테이너는 시작되지 않습니다

run -e 옵션
컨테이너 내부의 환경변수 설정

docker exec -i -t wordpressdb /bin/bash
echo $MYSQL_ROOT_PASSWORD
password

exec 명령어를 사용하면 컨테이너 내부에서 명령어를 실행 한뒤 그 결과값을 받을수 있습니다.

run --link 옵션
내부 ip를 알 필요 없이 항상 컨테이너에 별명으로 접근하도록 설정합니다.

2.2.6 도커 볼륨

2.2.6.1 호스트 볼륨 공유

첫 번째로 호스트와 볼륨을 공유함으로써 데이터베이스 컨테이너를 삭제해도 데이터는 삭제되지 않도록 설정해봅시다.

docker run -d --name wordpressdb_hostvolume -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /Users/docker/wordpress_db:/var/lib/mysql mysql:5.7

/Users/docker/wordpress_db 는 로컬 디렉토리 경로입니다. 로컬개발환경에 맞게 다른경로 사용가능합니다.

docker rm -f wordpressdb_hostvolume

컨테이너를 생성해도 로컬에 있는 /Users/docker/wordpress_db 그대로 남아 있습니다.

2.2.6.2 볼륨 컨테이너

볼륨을 사용하는 두 번째 방법은 -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것입니다. 컨테이너를 생성할 때, --volumnes-from 옵션을 설정하면 -v 또는 --volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유할 수 있습니다.

docker run -i -t --name volume_overide -v /Users/docker/wordpress_db:/home/testdir_2 alicek106/volume_test
docker run -i -t --name volumes_from_container --volumes-from volume_overide ubuntu:14.04

2.2.6.3 도커 볼륨

볼륨을 활용하는 세 번재 방법은 docker volume 명령어를 사요하는 것입니다.
볼륨을 다루는 명령어는 docker volume으로 시작하며 docker volume create 명령어로 볼륨을 생성합니다.

docker volume create --name myvolume

도커 볼륨을 조회합니다.

docker volume ls

위에서 생성한 myvolume 를 사용하는 컨테이너를 생성합니다.

[볼륨의 이름]:[컨테이너의 공유 디렉토리]

docker run -i -t --name myvolume_1 -v myvolume:/root/ ubuntu:14.04

컨테이너에서 공유할 디렉터리의 위치를 -v 옵션에 입력하면 해당 디렉터리에 대한 볼륨을 자동으로 생성합니다.

docker run -i -t --name volume_auto -v /root ubuntu:14.04

2.2.7 도커 네트워크

2.2.7.1 도커 네트워크 구조

docker network ls
도커에서 기본적으로 쓸 수 있는 네트워크 확인

docker network create --driver bridge mybridge

브리지 타입의 mybridge 네트워크 생성

docker run -i -t --name mynetwork_container --net mybridge ubuntu:14.04
root@7b986d32898b:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:12:00:02  
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1392 (1.3 KB)  TX bytes:0 (0.0 B)

호스트 네트워크

논 네트워크

컨테이너 네트워크

MacVLAN 네트워크

호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공합니다.

2.2.8 컨테이너 로깅

2.2.8.1 json-file 로그 사용하기

도커는 컨테이너의 표준출력과 에러 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공합니다.

docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7

docker logs mysql
docker logs --tail 2 mysql
docker logs --since 144432123122 mysql

유닉스 시간을 입력해 특정 시간 이후의 로그를 확인할 수 있습니다.
기본적으로 컨테이너 로그는 json형태로 도커 내부에 저장됩니다.

profile
unit test, tdd, bdd, laravel, django, android native, vuejs, react, embedded linux, typescript

0개의 댓글