도커는 다음과 같이 Client - Server 구조로 이루어져 있음.
docker CLI는 도커 호스트에 명령을 전달하고 결과를 받아서 출력함.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST][COMMAND] [ARG...]
OPTIONS | 기능 |
---|---|
-d | detached mode(백그라운드 모드) |
-p | 호스트와 컨테이너의 포트를 연결 |
-v | 호스트와 컨테이너의 디렉토리를 연결 |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
--name | 컨테이너 이름 설정 |
--rm | 프로세스 종료시 컨테이너 자동 제거 |
-it | -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 |
--network | 네트워크 연결 |
docker run ubuntu:20.04
run 명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)한 후 컨테이너를 생성(create)하고 시작(start)한다.
컨테이너는 정상적으로 실행됐지만 뭘 하라는 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료된다. 컨테이너는 프로세스이기 때문에 실행중인 프로세스가 없으면 컨테이너는 종료된다.
docker run --rm -it ubuntu:20.04 /bin/sh
컨테이너 내부에 들어가기 위해 sh를 실행하고 키보드 입력을 위해 -it 옵션을 줌.
추가적으로 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm 옵션도 추가.
--rm 옵션이 없다면 컨테이너가 종료되더라도 삭제되지 않고 남아 있어 수동으로 삭제해야 함.
docker run --rm -it ubuntu:20.04 /bin/sh
도커는 다양한 리눅스 배포판을 실행할 수 있음. 공통점은 모두 동일한 커널을 사용한다는 점.
docker run --rm -p 5678:5678 hashicorp/http-echo -text="hello world"
-p 옵션을 주어 본인 호스트의 5678포트와 컨테이너 포트를 연결함.
docker run --rm -p 1234:6379 redis
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
mysql 접속 : docker exec -it mysql mysql
*exec 명령어는 run 명령어와 달리 실행중인 도커 컨테이너에 접속할 때 사용하며 컨테이너 안에서 ssh server등을 설치하지 않고 exec 명령어로 접속한다.
도커는 다양한 데이터베이스를 손쉽게 생성/삭제할 수 있기 때문에 개발할때도 많이 사용함.
docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=host.docker.internal \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress
-e 옵션을 주어 환경변수를 설정할 수 있음.
docker ps
실행중인 컨테이너 목록을 확인하는 명령어.
docker ps -a
중지된 컨테이너도 확인하려면 -a 옵션을 붙임.
docker stop [OPTIONS] CONTAINER [CONTAINER...]
실행중인 컨테이너를 중지하는 명령어. 실행중인 컨테이너를 하나 또는 여러개(띄어쓰기)중지할 수 있음.
docker rm [OPTIONS] CONTAINER [CONTAINER...]
종료된 컨테이너를 완전히 제거하는 명령어.
docker logs [OPTIONS] CONTAINER
옵션 : -f, --tail
docker images [OPTIONS]REPOSITORY[:TAG]]
도커가 다운로드한 이미지 목록을 보는 명령어.
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
이미지를 다운로드하는 명령어.
docker rmi [OPTIONS] IMAGE [IMAGE...]
이미지를 삭제하는 명령어. images 명령어를 통해 얻는 이미지 목록에서 이미지 ID를 입력하면 삭제가 된다. 단, 컨테이너가 실행중인 이미지는 삭제되지 않음.
docker network create [OPTIONS] NETWORK
도커 컨테이너끼리 이름으로 통신할 수 있는 가상 네트워크를 만든다.
ex) docker network create app-network
docker network connect [OPTIONS] NETWORK CONTAINER
기존에 생성된 컨테이너에 네트워크를 추가한다.
ex) docker network connect app-network mysql
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
워드프레스를 app-network에 속하게 하고 mysql을 이름으로 접근한다.
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
docker-compose up
docker-compose 실행
docker-compose down
docker-compose 종료
version: '3'
docker-compose.yml 파일의 명세 버전
docker-compose.yml 버전에 따라 지원하는 도커 엔진 버전도 다름
services:
postgres:
...
django:
...
실행할 컨테이너 정의
docker run --name django와 같다고 생각할 수 있음
services:
django:
image: django-sample
컨테이너에 사용할 이미지 이름과 태그
태그를 생략하면 latest
이미지가 없으면 자동으로 pull
services:
django:
...
ports:
- "8000:8000"
컨테이너와 연결할 포트
{호스트 포트} : {컨테이너 포트}
services:
mysql:
...
environment:
- MYSQL_ROOT_PASSWORD=somewordpress: '3'
컨테이너에서 사용할 환경변수
{환경변수 이름} : {값}
services:
django:
...
volumes:
- ./app:/app
마운트하려는 디렉터리
{호스트 디렉터리}:{컨테이너 디렉터리}
services:
django:
restart: always
재시작 정책
django:
build:
context: .
dockerfile: ./compose/django/Dockerfile-dev
이미지 자체 빌드 후 사용
image 속성 대신 사용함
여기에 사용할 별도의 도커 파일이 필요함
docker-compose.yml에 정의된 컨테이너를 실행
docker-compose up
docker-compose up -d : docker run의 -d 옵션과 동일
docker-compose up --force-recreat : 컨테이너를 새로 만들기
docker-compose up --build : 도커 이미지를 다시 빌드(build로 선언했을 때만)
멈춘 컨테이너를 재개
docker-compose start
docker-compose start wordpress : wordpress 컨테이너만 재개
컨테이너를 재시작
docker-compose restart
docker-compose restart wordpress : wordpress 컨테이너만 재시작
컨테이너 멈춤
docker-compose stop
docker-compose stop wordpress : wordpress 컨테이너만 멈춤
컨테이너를 종료하고 삭제
컨테이너의 로그
docker-compose logs
docker-compose logs -f : 로그 follow
컨테이너 목록
실행중인 컨테이너에서 명령어 실행
docker-compose exec {컨테이너 이름} {명령어}
docker-compose exec wordpress bash
컨테이너 build 부분에 정의된 내용대로 빌드
build로 선언된 컨테이너만 빌드됨
docker-compose build
docker-compose build wordpress : wordpress 컨테이너만 build
참고자료