6 분 소요

 인프런 초보를 위한 도커 안내서을 학습하고 정리한 내용 입니다.

도커 설치하기

Linux

1
curl -s https://get.docker.com/ | sudo sh

명령어를 입력하고 패스워드를 입력하면 리눅스 배포판에 따라 자동으로 최신버전의 도커를 설치

1
sudo usermod -aG docker ubuntu

ubuntu 유저 권한 추가

MacOS or Windows

Docker for Mac / Docker for Windows - 가장 쉽고 빠르게 사용할 수 있는 방법

  • 도커는 기본적으로 linux를 지원하기 때문에 MacOS와 Windows에 설치되는 Docker는 가상머신에 설치됨
  • MacOS는 xhyve를 사용하고 Windows는 Hyper-V 사용
    • Windows Pro에서만 설치가 가능했으나 Windows WSL 2를 이용하여 Home 버전도 설치 가능
    • 그 외에 Windows 사용자는 VirtualBox에 ubuntu 리눅스를 설치하여 실습
1
docker version

도커가 잘 설치된 걸 확인할 수 있다.

나는 윈도우 환경인데 설치 방법은 구글 검색해보면 많이 나와 있다.

Client - Server 구조

docker CLI는 도커 호스트에 명령을 전달하고 결과를 받아서 출력함

도커 기본 명령어 (run)

run - 컨테이너 실행

1
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
  • -d : detached mode (백그라운드 모드)
  • -p : 호스트와 컨테이너의 포트를 연결
  • -v : 호스트와 컨테이너의 디렉토리를 연결
  • -e : 컨테이너 내에서 사용할 환경변수 설정
  • --name : 컨테이너 이름 설정
  • --rm : 프로세스 종료 시 컨테이너 자동 제거
  • -it : -i, -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
  • --network : 네트워크 연결

ubuntu 20.04 컨테이너 만들기

1
docker run ubuntu:20.04

run명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull) 한 후 컨테이너를 생성(create)하고 시작(start)

컨테이너는 정상적으로 실행됐지만 뭘 하라고 명령어를 전달하지 않았기 때문에 컨테이너는 생성되자마자 종료.

컨테이너는 프로세스이기 때문에 실행중인 프로세 스가 없으면 컨테이너는 종료.

뭘 막 다운받고 끝났다.

/bin/sh 실행하기

1
docker run --rm -it ubuntu:20.04 /bin/sh

컨테이너 내부에 들어가기 위해 sh를 실행하고 키보드 입력을 위해 -it 입력.

추가적으로 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm 옵션도 추가. --rm 옵션이 없다면 컨테이너가 종료되더라도 삭제되지 않고 남아 있어 수동으로 삭제 해야 함.

우분투로 잘 들어가졌다.

CentOS 실행하기

1
docker run --rm -it centos:8 /bin/sh

도커는 다양한 리눅스 배포판을 실행할 수 있다. 공통점은 모두 동일한 커널을 사용해야 한다는 점이다.

Ubuntu또는 CentOS에 포함된 다양한 기본기능이 필요 없는 경우, Alpine이라는 초 소형 (5MB) 이미지를 사용할 수도 있다.

아까랑 다른 CentOs가 설치 돼서 실행된다.

웹 어플리케이션 실행하기

이번엔 간단한 웹 어플리케이션 이미지를 받아서 한번 실행해보자.

1
2
3
4
docker run --rm -p 5678:5678 hashicorp/http-echo -text="hello world" 

# m1 
docker run --rm -p 5678:8080 ghcr.io/subicura/http-echo --text="hello world"

etached mode(백그라운드 모드)로 실행하기 위해 -d옵션을 추가하고 -p옵션을 추가하여 컨테이너 포트를 호스트의 포트로 연결함.

그럼 하나 더 띄워 보자.

1
docker run --rm -p 5679:5678 hashicorp/http-echo -text="hello docker"

두 서버를 명령어 두 줄로 띄워 버렸다.

Redis 실행하기

1
docker run --rm -p 1234:6379 redis

레디스는 이미 이미지가 있어서 바로 만들어졌다. 어쨌든 실행이 잘 된 걸 볼 수 있다.

MySQL(MariaDB) 실행하기

1
2
3
4
docker run -d -p 3306:3306 \ 
	-e MYSQL_ALLOW_EMPTY_PASSWORD=true \ 
	--name mysql \ 
	mariadb:10.9

이렇게 설치가 끝났고 여기서는 이름을 mysql이라 지어줬다. 비밀번호는 안 쓰도록 설정했다.

그럼 이걸 실행해야 한다.

1
docker exec -it mysql mysql

바로 설치 및 작동이 됐다!

exec 명령어

exec명령어는 run명령어와 달리 실행 중인 도커 컨테이너에 접속할 때 사용하며 컨테이너 안에 ssh server등을 설치하지 않고 exec명령어로 접속함.

도커 기본 명령어 (ps, stop, rm ,logs, images, etc..)

ps 명령어

실행중인 컨테이너 목록을 확인하는 명령어.

1
docker ps

컨테이너 아이디, 이미지, 이름, 실행 시간 등 알 수 있다.

그럼 꺼진 컨테이너도 한번 보자.

1
docker ps -a

꺼져있는 레디스 컨테이너가 나와있다.

stop 명령어

1
docker stop [OPTIONS] CONTAINER [CONTAINER...]

실행 중인 컨테이너를 중지하는 명령어. 실행 중인 컨테이너를 하나 또는 여러 개 (띄어쓰기) 중지할 수 있다.

마리아 디비가 꺼졌다.

rm 명령어

1
docker rm [OPTIONS] CONTAINER [CONTAINER...]

종료된 컨테이너를 완전히 제거하는 명령어.

hashicorp 컨테이너를 한번 삭제해보자.

삭제가 잘 됐다.

logs 명령어

1
docker logs [OPTIONS] CONTAINER

컨테이너가 정상적으로 동작하는지 확인하는 좋은 방법은 로그를 확인하는 것. 기본 옵션과 -f, --tail옵션을 살펴보자.

그냥 쌩 무옵션을 실행하면 한번에 띄우고 바로 끝난다.

-f 옵션을 넣으면 끝나지 않고 계속 대기 상태가 된다.

--tail 10 옵션을 주면 아래 10줄을 출력하게 된다.

images 명령어

1
docker images [OPTIONS] [REPOSITORY[:TAG]]

도커가 다운로드한 이미지 목록을 보는 명령어.

pull 명령어

1
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

이미지를 다운로드만 하는 명령어

1
docker pull ubuntu:18.04

설치만 되고 실행은 안된다.

rmi 명령어

1
docker rmi [OPTIONS] IMAGE [IMAGE...]

이미지를 삭제하는 방법

단, 컨테이너가 실행중인 이미지는 삭제되지 않음.

network 명령어

출처 : https://fronquarry.tistory.com/38

도커 컨테이너끼리 이름으로 통신할 수 있는 가상 네트워크.

create 명령어

1
2
3
4
docker network create [OPTIONS] NETWORK

#ex
docker network create app-network

app-network라는 이름으로 wordpress와 mysql이 통신할 네트워크를 만들었다.

connect 명령어

1
2
3
4
docker network connect [OPTIONS] NETWORK CONTAINER

#ex 
docker network connect app-network mysql

기존에 생성된 컨테이너에 네트워크를 추가.

mysql 컨테이너에 네트워크를 추가.

1
2
3
4
5
6
7
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

이런 식으로도 실행하면서 추가가 가능하다.

도커 volume

원래 도커는 개별적인 가상화 환경이기 때문에 작업하는 모든 데이터는 컨테이너 내부에 존재하게 됨.

그런데 컨테이너를 삭제하면 작업했던 모든 데이터가 사라짐.

현재 위에서도 wp + mysql을 쓰고 있는데 mysql을 삭제시키면 wp에서 만든 데이터들 다 사라짐.

이걸 유지 시키고 싶을 때 volume을 사용하게 됨. 볼륨은 한마디로 컨테이너 내부의 데이터를 외부로 링크를 걸어주는 기능

1
2
3
4
5
# test 볼륨 생성
docker volume create test

# 볼륨 조회
docker volume ls

특정 볼륨에 대한 자세한 정보가 알고 싶다면

1
docker volume inspect [volume]

다음과 같이 나오게 된다.

이제 이 볼륨을 컨테이너에 마운트 해보자.

1
docker run --name redis-test -p 6377:6379 -v test:/redis -d redis --appendonly yes

레디스 서버를 하나 실행시키면서 -v test:/redis로 마운트 시켰다.

1
docker run --name redis-test -p 6377:6379 -v /home/tigen/redis -d redis --appendonly yes

다음과 같이 볼륨을 지정하지 않고 특정 경로에 바로 만들 수도 있다.

https://www.daleseo.com/docker-volumes-bind-mounts/ 참고

도커 컴포즈 docker-compose

지금까지 명령어를 학습해보면서 띄어쓰기나 오타, 뭐 좀 조심스럽게 입력해야 한다.

도커 컴포즈는 이런 걸 한 파일로 만들어서 쉽게 관리할 수 있도록 도와주는 역할이다.

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'  
services:
  db:
    image: mariadb:10.9
    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_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress

해당 파일 위치로 가서

1
docker-compose up -d

뭐가 막 뜨더니

워드프레스 서버가 띄워졌다!

1
docker-compose down

docker-compose를 이용하여 mysql과 wordpress를 종료.

도커 컴포즈 문법

version

1
version: '3'

docker-compose.yml 파일의 명세 버전 docker-compose.yml 버전에 따라 지원하는 도커 엔진 버전도 다름

https://docs.docker.com/reference/compose-file/legacy-versions/

services

실행할 컨테이너 정의

1
2
3
4
5
services: 
	postgres: 
		... 
	django: 
		...

docker run –name django과 같다고 생각할 수 있음

image

1
2
3
services: 
	django: 
		image: django-sample

컨테이너에 사용할 이미지 이름과 태그

태그를 생략하면 latest, 이미지가 없으면 자동으로 pull

ports

1
2
3
4
5
services: 
	django: 
		... 
		ports: 
			- "8000:8000"

컨테이너와 연결할 포트(들), {호스트 포트}:{컨테이너 포트}

environment

1
2
3
4
5
services: 
	mysql: 
		... 
		environment: 
			- MYSQL_ROOT_PASSWORD=somewordpress: '3'
  • 컨테이너에서 사용할 환경변수(들)
  • {환경변수 이름}:{값}

volumes

1
2
3
4
5
services: 
	django: 
		... 
		volumes: 
			- ./app:/app

마운트하려는 디렉터리(들), {호스트 디렉터리}:{컨테이너 디렉터리}

restart

1
2
3
services: 
	django: 
		restart: always

재시작 정책

  • restart: “no”
  • restart: always
  • restart: on-failure
  • restart: unless-stopped

build

1
2
3
4
django: 
	build: 
		context: . 
		dockerfile: ./compose/django/Dockerfile-dev

이미지를 자체 빌드 후 사용, image 속성 대신 사용함. 여기에 사용할 별도의 도커 파일이 필요함.

도커 컴포즈 명령어

  • up : docker-compose.yml에 정의된 컨테이너를 실행
    • docker-compose up
    • docker-compose up -d
      • docker run의 -d 옵션과 동일
    • docker-compose up –force-recreate
      • 컨테이너를 새로 만들기
    • docker-compose up –build
      • 도커 이미지를 다시 빌드(build로 선언했을 때만)
  • start : 멈춘 컨테이너를 재개
    • docker-compose start
    • docker-compose start {name}
      • {name} 컨테이너만 재개
  • restart : 컨테이너를 재시작
    • docker-compose restart
    • docker-compose restart {name}
      • {name} 컨테이너만 재시작
  • stop : 컨테이너 멈춤
    • docker-compose stop
    • docker-compose stop {name}
      • {name} 컨테이너만 멈춤
  • down : 컨테이너를 종료하고 삭제
    • docker-compose down

그 외 docker와 똑같은 명령어

  • logs
    • docker-compose logs
    • docker-compose logs -f
  • ps
    • docker-compose ps
  • exec
    • docer-compose exec {컨테이너 이름} {명령어}
      • docker-compose exec wordpress bash
  • build
    • build로 선언된 컨테이너만 빌드됨

댓글남기기