https://docs.docker.com/compose/

 

Overview of Docker Compose

 

docs.docker.com

Docker Compose란?

  • 여러 Container를 일괄적으로 정의하고 실행할 수 있는 툴
    • Container들을 서비스단위로 묶어서 관리

 

Docker Compose 설치

https://docs.docker.com/compose/install/

 

Install Docker Compose

 

docs.docker.com

 

 

Docker compose yml 파일내 명령어

Docker Compose 명령어 사용예)
version
  compose 버전, 버전에 따라 지원 문법이 다름
version: "2"
services
  컴포즈를 이용해서 실행할 Container 옵션 정의
service:
  webserver:
    image: nginx
  db:
    image: redis
build
  컨테이너 빌드
web:
  build: .
image
  compose를 통해 실행할 이미지를 지정
redis:
  image: redis
command
  Container에서 실행될 명령어 지정
 web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
port
  Container가 공개하는 포트를 나열
 ports:
      - "3000:3000"
link
  다른 Container와 연계할 Container지정
webserver:
  image: wordpress
    link:
      db: mysql
expose
  포트를 링크로 연계된 Container에게만 공개할 포트
services:
  nginx:
    build: .
    expose:
      - "8080"
volumes
  Container 볼륨 마운트지정
services:
  db:
    image: postgres
    volumes:
      - /db:/var/lib/postgresql/data
environment
  환경변수 설정
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
restart
  
Container가 종료될 때 적용할 restart 정책
  no: 재시작 되지 않음
  always: Container를 수동으로 끄기 전까지 항상 재시작
  no-failure: 오류가 있을 시에 재시작
    volumes:
      - db_data:/var/lib/mysql
    restart: always
depends_on
  Container 간의 종속성을 정의
  Container간 동작 순서 지정
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db

 

Docker Compose 실행명령어

https://docs.docker.com/compose/reference/

 

Overview of docker-compose CLI

 

docs.docker.com

 

'클라우드 > Docker' 카테고리의 다른 글

Docker network  (0) 2021.08.17
Container volume  (0) 2021.08.15
Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11

Docker Host내 통신

 docker0

  • virtual eth bridge: 172.17.0.0/16
  • L2 network
  • Container 생성시 veth 인터페이스 생성(sandbox)
    • 172.17.X.Y로 IP주소 할당
  • 모든 Container의 gateway역할을 수행
  • container running 시 172.17.X.Y로 IP 주소할당

 

 

 

port-forwarding

https://linux.die.net/man/8/iptables

 

iptables(8) - Linux man page

iptables(8) - Linux man page Name iptables - administration tool for IPv4 packet filtering and NAT Synopsis iptables [-t table] -[AD] chain rule-specification [options] iptables [-t table] -I chain [rulenum] rule-specification [options] iptables [-t table]

linux.die.net

  • port-forwarding 실행
    • -p [sourcePort:destPort] 
      • # docker run --name web1 -d -p 80:80 nginx
    • -p [destPort]
      • random sourcePort가 할당된다.
        • # docker run --name web2 -d -p 80 nginx
    • -P
      •  random sourcePort가 할당되고 해당 container의 dockerfile의 EXPOSE port가 destPort로 지정된다.
        • # docer run --name web3 -P nginx

 

 

 

user defined bridge network 생성

User define bridge network 생성 및 조회

  • network 조회
    • # docker network ls

user define netwrok를 사용하여 container 생성

  • User define bridge network 생성
    • # docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 userdefineNet
  • User define network를 사용하여 container생성
    • # docker run -d --net userdefineNet --ip 192.168.100.2 -p 8888:80 --name webserver3 nginx

 

 

 

Docker Host내 Container간 통신

  • MySQL Container 생성
    • # docker run -d -v /database:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootPass -e MYSQL_PASSWORD=wordpressPass mysql:5.7
  • Wordpress Container 생성
    • # docker run -d --name wordpress --link mysql:db -e WORDPRESS_DB_PASSWORD=wordpressPass -p 80:80 wordpress:4

'클라우드 > Docker' 카테고리의 다른 글

Docker Compose  (0) 2021.08.18
Container volume  (0) 2021.08.15
Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11

Volume 옵션을 사용하여 Docker host에 vloume mount를 활용하여 data 영구보존

방식 사용예시
DockerHost <-> Container
-> DockerHost의 volume Mount path 지정
# docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql
  -> Dockerhost의 /dbdata 폴더를 volume mount하여 Container와 연결
DockerHost <-> Container
-> DockerHost의 vloume Mount path 미지정

# docker run -d --name db -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql
  -> /var/lib/docker/volumes/{UUID}/_data 위치에 volume mount
DockerHost <-> Container
-> Container path ro(read only) 지정
# docker run -v /webdata:/usr/share/nginx/html:ro -d --name web -p 80:80 nginx
  -> Container안에서는 write 불가

 

 

볼륨 마운트를 사용하여 호스트와 Container간 파일공유

  • # docker run -d -p 80:80 --name nginx -v /var/mountTest:/home:ro nginx
    • 호스트의 /var/mountTest/ 디렉토리와 Container /home/ 디렉토리를 readyOnly로 볼륨마운트 지정
      • Container의 home 디렉토리에 w 불가능
      • DockerHost의 /var/mountTest에는 rw 가능
    • rw: 읽기 및 쓰기

'클라우드 > Docker' 카테고리의 다른 글

Docker Compose  (0) 2021.08.18
Docker network  (0) 2021.08.17
Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11

memory관련 옵션

옵션(단위: bytes) 의미
-m, --memory  메모리 제한 # docker run -d -m 256m nginx
--memory-swap  컨테이너의 swap 메모리 설정
memory + swap
default: 기본 메모리 == 메모리의 2배 설정
#docker run -d -m 300m --memory-swap 500m nginx
실제 swap은 200m까지 가능
--memory-reservation 최소 xxx bytes까지는 보장  #docker run -d -m 1g --memory-reservation 300m nginx
--oom-killi-disable 프로세스가 OOM상태에서 프로세스를 kill하지 못하도록 함 #docker run -d -m 200m --oom-kill-disable nginx

 

 

CPU 제한

옵션(단위: core) 의미
--cpus 컨테이너에 할달할 CPU core수 지정 #docker run -d --cpus=".5" nginx
--cpuset-cpus 컨테이너가 사용할 수 있는 CPU core할당
해당 core range에서 동작할 수 있게 지정
#docker run -d --cpuset-cpus 0-3 nginx
--cpu-share 전체 CPU에서 비중을 지정
default: 1024
#docker run -d --cpu-share 2048 nginx

 

 

Block IO 제한

옵션 의미
--blkio-weight
--blkio-weight-device
block IP weight를 지정(10~1000)
default: 500
#docker run -it --rm --blkio-weight 100 ubunbu /bin/bash
--device-read-bps
--device-write-bps
초당 read/write 설정

#docker run -it --rm --device-read-bps /dev/vda:1mb ubunbtu /bin/bash
#docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu /bin/bash
--device-read-iops
--device-write-iops
컨테이너의 read/write 속도 쿼터 설정 #docker run -it --rm --device-read-iops /dev/vda:10 ubuntu /bin/bash
#docker run -it --rm --device-write-iops /dev/vda:10 ubuntu /bin/bash

 

 

docker host에서 container 리소스 확인

  • 위치 /sys/fs/cgroup/memory/docker/container hash값/

 

 

docker stats

  • # docker stats

 

cAdvisor를 통한 리소스모니터링

https://github.com/google/cadvisor

 

GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

Analyzes resource usage and performance characteristics of running containers. - GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

github.com

 

'클라우드 > Docker' 카테고리의 다른 글

Docker network  (0) 2021.08.17
Container volume  (0) 2021.08.15
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11

Registry

  • Container 이미지를 저장하는 저장소

Docker Hub(https://hub.docker.com/)

  • 외부에 공유가능한 Container 저장소
  • Official imagaes, Verified Publisher container images
  • #docker search "docker hub image"

Private Registry

  • 사내 또는 개인 Container 저장소

 

 

Private registry 구현 및 사용

https://hub.docker.com/_/registry

  • Docker hub에서 제공하는 official registry image를 통해서 private registry를 구성하고 관리할 수 있다.

 

Private registry 생성

  • # docker run -d --name docker-registry -p 5000:5000 registry

Private registry에 push한 image tag변경

  • # docker tag fastwon1/docker-test 127.0.0.1:5000/docker-test

Private registry에 image push

  • # docker push 127.0.0.1:5000/docker-test

단일 [이미지 or 컨테이너] 세부내용 조회

  • docker inspect httpd
    • ex) docker inspect --format '{{.NetworkSettings.Networks.bridge.NetworkID}}' httpd

존재하는 Docker image 전체 삭제

  • # docker rmi `docker images -q -a` -f

앞단계에서 push했던 이미지를 pull하여 확인

  • # docker pull 127.0.0.1:5000/docker-test

 

Private registry에 저장된 이미지 확인

  • # curl -X GET http://localhost:5000/v2/_catalog

이미지의 태그정보확인

  • # curl -X GET http://localhost:5000/v2/docker-test/tags/list

 

 

 

 

'클라우드 > Docker' 카테고리의 다른 글

Container volume  (0) 2021.08.15
Docker resource 관리  (0) 2021.08.14
Docker image 생성 및 테스트  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11
Docker?  (0) 2020.12.27

Dockerfile이란?

  • Container를 만들 수 있도록 하는 명령어들의 집합

ref: docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

 

 

 

Dockerfile 인스트럭션

인스트럭션 설명 형식
FROM 우분투와 같은 운영체제 이름이나 필요한 애플리케이션 이름을 지정 FROM ubuntu:14.04
MAINTANER 이미지를 생성한 사람의 이름 및 정보  
RUN 컨테이너가 빌드될 때 실행할 명령어 RUN ["mv", "1234", "5678"]
EXPOSE 컨테이너 외부에 노출할 포트 지정 EXPOSE 8080
ENV 환경변수 이름지정 ENV abc tmp
echo ${abc}
CMD 컨테이너가 시작될 때 실행할 명령어 CMD ["echo", "1234"]
CMD ["node", "/hello.js"]
ENTRYPOINT 컨테이너가 실행될 때 기본 명령어 지정
(CMD 와 달리 옵션을 넘길 수 있음)
ENTRYPOINT ["python"]
...
$
sudo docker run t 이미지 -c "print('1234')"
WORKDIR 작업할 디렉토리를 세팅 WORKDIR /project
USER 도커 실행 시 사용할 유저 이름 또는 uid 를 지정
설정하지 않으면 기본 root으로 실행
USER user 또는 USER user:group
VOLUME 호스트의 디렉토리를 도커에 연결
커밋 없이 사용 가능하며 주로 로그 수집이나 데이터 저장용도로 사용
VOLUME [/"tmp"]
COPY 컨테이너 빌드시 호스트의 파일이나 디렉토리를 복사할때 사용 COPY file /copy/to/path

ADD 컨터이너 빌드시 호스트의 파일(tar,url포함)을 컨테이너로 복사할때 사용 ADD http://example.com/big.tar.xz /usr/src/things/
ADD rootfs.tar.gz /
ARG    
SHELL 원하는 타입의 쉘을 사용 SHELL ["/ sh ", c"]
SHELL [" cmd ", "/S", "/]
# comment  

 

 

nginx image생성 및 dockerhub push test

  • # docker build -t fastwon1/docker-test .
    • Docker이미지 빌드
  • # docker push fastwon1/docker-test
    • image이름을 [계정/image이름] 형식으로 변경이 필요한경우
      • # docker tag docker-test fastwon1/docker-test
    • Private repository에 push
    • 이미지의 namespace와 자신의 아이디가 일치해야한다
      • # docker tag foo/sample_image:latest username/sample_image:latest
        • namespace가 일치하지 않는다며 태그명 변경으로 해결할 수 있다
    • 에러시 https://hub.docker.com의 id/pass로 docker login이 필요

 

 

Docker history 확인

  • # docker history nginx
    • Docker이미지를 생성하면서 발생한 명령어들을 확인할 수 있다

 

 

Dockerfile 작성 및 apache2 container 생성 테스트

FROM ubuntu:18.04  
LABEL maintainer="jaehwan.jaon <fastwon1@gamil.com>"
RUN apt-get update \
    && apt-get install -y apache2 \
    && apt-get install -y --no-install-recommends apt-utils
RUN echo "apache2 start test" > /var/www/html/index.html
EXPOSE 80
CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"]

 

dockerfile을 이용하여 container 생성

# docker build -t fastwon1/apathc2-test:v1 .

생성한 Docker image로 container 생성
web 접속

 

 

기타

명령어 설명
sudo docker container prune 중지 된 모든 컨테이너를 제거
sudo docker image prune 태그가 없는 모든 이미지 파기
sudo docker system prune 사용하지 않는 모든 데이터 삭제 이미지 , 컨테이너 , 볼륨 , 네트워크등
sudo docker container stats 컨테이너 사용 현황 출력

'클라우드 > Docker' 카테고리의 다른 글

Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11
Docker?  (0) 2020.12.27
Docker 설치  (0) 2020.12.27

 

1. local repository에서 docker이미지 검색

  • # docker serach tomcat

 

2. Dockerhub에서 container image pull

 

Docker Hub

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your teams' container applications.

hub.docker.com

 

3. Container create/start

  • mysql Container create
    • # docker create -p 9876:3306 --name mysql-test -e MYSQL_ROOT_PASSWORD=password mysql
      • 컨테이너 생성
      • -e option: 환경변수 설정
    • # docker start mysql-test
      • Dockerhost에서 mysql 접속
        • docker exec -it db mysql -u root -p

 

4. Container 실행

컨테이너 실행
실행결과(virtualbox에서 실행중이라면,, 네트워크 port-forwarding 설정필요)

  • # docker run -d -p 8080:8080 --name run-test consol/tomcat-7.0
    • run명령어는 컨테이너 create와 start를 동시에 실행
      • 만약 이미지가 pulling이 되어있지 않은 경우 pull을 실행하고 create/start를 진행한다
    • consol/tomcat-7.0 docker 이미지를 데몬으로 portforwarding 8080으로 실행
  • # docker run -d -p 8080:8080 --rm --name run-test2 consol/tomcat-7.0
    • rm옵션을 주면 Container가 중지되면 바로 삭제되는 임시컨테이너를 생성할 수 있다
  • # docker ps -a
    • 컨테이너 확인

 

5. Container 시작/중지/삭제

  • # docker stop a76e5848164a
    •  컨테이너 중지
  • # docker start a76e5848164a
    • 컨테이너 시작
  • # docker rm a76e5848164a
    • 컨테이너 삭제
      • 컨테이너 중지후 삭제가 가능

 

6. Container 전체 중지/시작/삭제

  • # docker stop `docker container ls -a -q`
    • 전체 중지
  • # docker start `docker container ls -a -q`
    • 전체 시작
  • # docker rm `docker container ls -a -q`
    • 전체 삭제

 

7. Docker 이미지 전체삭제

  • # docker rmi `docker images -a -q`

 

8. Container bash 접속

Container bash 접속

  • # docker exec -it [CONTAINER ID or NAMES]  /bin/bash

 

9. Container 로그확인

  • # docker logs run-test 
    • stdout

10. Container내 기타조회

  • Container내의 프로세스 조회
    • # docker top [CONTAINER ID or NANES]
  • Container내의 log 조회
    • docker logs [CONTAINER ID or NANES]
      • ex) docker logs -f nginx_test
        • 실시간 발생로그 확인

 

11. Docker host와 Container간 파일복사

  • Docker host 파일을 Container로 복사
    • docker cp [docker host의 파일 source file path] [container의 dest path]
      • # docker cp ./cpTest.txt 60dbe0c2f189:/home/ 
  • Container의 파일을 Docker host로 복사
    • docker cp [Container내의 파일 source path] [Dcoker dest path] 
      • # docker cp 60dbe0c2f189:/home/cpTest.txt ./

'클라우드 > Docker' 카테고리의 다른 글

Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11
Docker?  (0) 2020.12.27
Docker 설치  (0) 2020.12.27

Docker host란?

  • Docker daemon이 동작하는 시스템

 

 

 

Container 기술란?

  • 호스트OS상에서 리소스를 분리시키고 논리적으로 격리시켜 마치 별도서버처럼 동작할 수 있게 만드는 기술

 

 

 

Container 이란?

  • Docker host에서 구동하는 isolation된 프로세스

 

 

 

Container를 가능하게 하는 Linx kernel 기능

  1. chroot(change Loot Directory)
    • 프로세스가 기본으로 인식하는 리눅스 최상위 root directory(/)를 다른 위치로 변경하여 특정프로세스가 상위 directory에 접근하지 못하도록 격리  
  2. namespace
    • 프로세스를 격리시킬 수 있는 기능(데이터에 이름을 붙혀 충돌을 방지)
      • 1. PID
        • 프로세스에 할당된 고유한 ID를 기반
      • Net
        • 네트워크 리소스를 기반
      • UID
        • UID,GID를 기반
      • MNT
        • 파일시스템 mount point 기반
      • UTS
        • 호스트 name이나 도메인명 긴반
      • IPC
        • 프로세스간 통신 object를  namespace별로 관리
  3. cgroup
    • 프로세스들의 자원(CPU,Disk,memory,network등)의 상태를 제한하고 격리시키는 기능

 

 

 

도커 라이프사이클

도커 라이프사이클

'클라우드 > Docker' 카테고리의 다른 글

Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11
Docker 설치  (0) 2020.12.27
 

Docker Documentation

 

docs.docker.com

 

  • 설치환경: virtualbox ubuntu 18.04

  • # sudo apt-get update
  • # sudo apt install docker.io -y
  • # usermod -a -G docker [fastwon1]
    • 계정에 Docker 관리자 권한부여

'클라우드 > Docker' 카테고리의 다른 글

Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11
Docker?  (0) 2020.12.27

+ Recent posts