출처 : 따배도 8~10 (Youtube)
docker image는 read only이다. container가 생성되고 컨테이너에 추가되는 데이터들은 별도의 RW 레이어에 저장된다.(Union File System=overlay) 하지만 container가 remove되면 rw layer의 정보를 잃게 된다. volume 명령어를 활용하면 container의 정보를 host에 저장할 수 있다.
# 컨테이너경로와 호스트경로를 volume mount (rw)
docker run -v 호스트경로:컨테이너경로
# 컨테이너경로는 호스트경로의 내용을 read only (if 권컨테이너의권한 = ro)
docker run -v 호스트경로:컨테이너경로:컨테이너의권한
# 컨테이너경로의 내용을 호스트내에 volume을 생성하여 volume mount
docker run -v 컨테이너경로 # 저장위치 : /var/lib/docker/volumes/UUID/_data
# volume list
docker volume ls
# volume remove
docker volume rm
docker daemon 이 start 하면 docker network interface인 docker0가 생성된다. docker0는 virtual ethernet bridge,즉 bridge 네트워크를 지원하는 가상 네트워크이다. birdge 네트워크는 NAT와 포트포워딩 기술을 지원한다. docker0에서는 컨테이너가 생성되면 자동으로 IP주소를 할당한다. Static한 IP주소를 임의로 부여할 수 없다.
포트포워딩 기술을 통해 container의 포트를 외부로 노출할 수 있다. 가장 일반적인 방법은-p 호스트포트:컨테이너포트
로 호스트포트와 컨테이너포트를 지정해주는 방법이다. 이때 호스트포트를 생략하여 -p 컨테이너포트
를 하게되면 호스트포트는 랜덤하게 지정된다. -P
옵션을 주게되면 Image에 EXPOSE로 미리 선언된 컨테이너포트를 사용하고 호스트포트는 역시 랜덤하게 정해진다. 포트포워딩 정보는 iptables -t nat -L -n -v
를 통해 확인할 수 있다.
기본적으로 docker0에서는 static ip 할당이 안된다. 하지만 user-defined network를 생성하게 되면 그 네트워크 내에서는 static ip를 할당할 수 있다.
$ docker network create --driver bridge \ # driver는 네트워크의 종류 default 값이 bridge (bridge/host/none)
--subnet 192.168.100.0/24 \ # 네트워크 대역
--gateway 192.168.100.254 \ # 게이트웨이 설정
mynet
# 네트워크 리스트 확인
$ docker netwokr ls
# 컨테이너 run할때 네트워크 지정
$ docker run -d -p 8080:8080 --name appjs \
--net mynet \ # 네트워크 지정
--ip 192.168.100.100 \ # static ip 할당
appjs
--link
를 통해 컨테이너간의 통신을 할 수 있다. wordpress의 내용이 mysql에 저장되고 mysql의 /var/lib/mysql
이 호스트의 /dbdata
에 저장되는 상황을 생각해볼 수 있다.
# wordpress. mysql 을 latest로 할땐 안됨;
$ docker run -d --name mysql -v /dbdata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=wordpress \
-e MYSQL_PASSWORD=wordpress mysql:5.7
$ docker run -d --name wordpress -p 8080:80 \
--link mysql:mysql \ # 연결할 컨테이너 이름:연결할 컨테이너 주소의 별칭
-e WORDPRESS_DB_PASSWORD=wordpress wordpress:4
link
를 하게되면 wordpress는 mysql에 의존적인 관계를 가지며, mysql이 실행되고 있지 않다면 wordpress는 실행되지 않는다.
alias crm='docker rm -f $(docker ps -aq)'
: 컨테이너 모두 삭제
하나의 서비스를 운영하기 위해서는 여러개의 애플리케이션이 동작해야한다. docker-compose.yaml
는 여러개의 컨테이너를 일괄적으로 정의하고 실행할 수 있는 툴이다. 컨테이너화 된 애플리케이션들을 통합적으로 관리할 수 있다.
version: "3.7"
services:
mysql:
image: mysql:5.7
networks:
mynet:
volumes:
- /dbdata:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_PASSWORD: wordpress
app:
depends_on:
- mysql
image: wordpress:4
# link를 해주지 않아도
# links:
# - mysql
networks:
mynet:
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_PASSWORD: wordpress
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: 192.168.100.0/24
# - gateway: 192.168.100.254 version 3 부터 gateway option 사라짐
link를 해주지 않아도 됨, depends_on 만 해주면 됨
docker compose에서 link와 depends_on의 차이 :
' When docker-compose executes V2 files, it will automatically build a network between all of the containers defined in the file, and every container will be immediately able to refer to the others just using the names defined in the docker-compose.yml file. '
docker-compose config : yml 파일의 문법을 check
docker-compose 명령어는 docker-compose up 한 폴더 기준으로 동작한다.
참고 : docker docs tutorial