Haneul's Blog

도커 튜토리얼(Amazon Linux 기준) 본문

Docker

도커 튜토리얼(Amazon Linux 기준)

haneulss 2022. 10. 3. 10:08

도커 설치하기

sudo yum install docker

도커 실행하기

sudo service docker start

sudo 없이 docker 사용하기

→ docker는 기본적으로 root 권한이 필요하기 때문에 root가 아닌 사용자가 sudo없이 사용하려면 해당 사용자를 docker 그룹에 추가해야 합니다.

# 현재 접속중인 사용자에게 권한 주기
sudo usermod -aG docker $USER

# 도커 재시작
sudo service docker restart

# 현재 사용자 로그아웃 및 재로그인
sudo su - # 루트사용자로 변경
su - ec2-user # 사용자로 변경

컨테이너 실행하기

도커를 실행하는 명령어

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

자주 사용하는 옵션들

docker options

ubuntu 16.04 container 실행

docker run ubuntu:16.04 를 생성하고 컨테이너 내부 들어가보자!

# 컨테이너 생성
docker run ubuntu:16.04

→ run 명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)를 한 후 컨테이너를 생성(create)하고 시작(start)한다.
위에서는 ubuntu:16.04 이미지를 다운받은 적이 없기에 이미지를 다운로드 받고 컨테이너가 실행되었지만 뭘 하라고 명령어를 전달하지 않았기에 바로 생성되자마자 바로 종료됩니다.

/bin/bash 명령어를 통한 컨테이너 실행

# /bin/bash: 컨테이너에 들어가기 위
# -it: 키보드 입력을 위함
# --rm: 프로세스가 종료되면 컨테이너 자동으로 삭제
docker run --rm -it ubuntu:16:04 /bin/bash

# exit: --rm 옵션을 주었기 때문에 컨테이너 종료
exit

redis container

→ redis는 메모리기반의 다양한 기능을 가진 스토리지로 6379 포트로 통신하며 telnet 명령어로 테스트해볼 수 있습니다.
redis 컨테이너는 datached mode(백그라운드 모드)로 실행하기 위해 -d 옵션을 추가하고 -p 옵션을 추가하여 컨테이너의 포트를 호스트의 포트로 연결해보겠습니다.

# -p 1234:6379: localhost의 1234포트를 컨테이너의 6379포트로 연결
docker run -d -p 1234:6379 redis

# redis test
$ telnet localhost 1234
set mykey hello
+OK
get mykey
$5
hello

# 나가기
quit

MySQL 5.7 container

→ MySQL은 가장 흔한 DB인데, 여기에 -e 옵션을 이용하여 환경변수를 설정하고 —name 옵션을 이용하여 컨테이너 읽기 어려운 ID 대신 쉬운 이름을 부여해보자(생략하면 도커가 자동으로 이름을 지어줌)

# -e MYSQL_ALLOW_EMPTY_PASSWORD=true: -e는 환경변수를 설정하기
# 위한 옵션으로 여기서는 패스워드 없이 root 계정을 만들기 위해 MYSQL_ALLOW_EMPTY_PASSWORD=true
# 환경변수를 설정해주었다.
docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

# mysql test
# 이건 mysql client가 있어야 함
mysql -h127.0.0.1 -uroot

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> quit

도커 기본 명령어

컨테이너 목록 확인하기(ps)

→ ps 명령어는 실행중인 컨테이너 목록을 보여줍니다.

docker ps

docker ps

#output
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
7bbebbab06ed   mysql:5.7   "docker-entrypoint.s…"   2 minutes ago    Up 2 minutes    0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
d2492849275c   redis       "docker-entrypoint.s…"   40 minutes ago   Up 40 minutes   0.0.0.0:1234->6379/tcp, :::1234->6379/tcp              charming_ellis

docker ps -a

docker ps -a

#output
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                                                  NAMES
7bbebbab06ed   mysql:5.7      "docker-entrypoint.s…"   3 minutes ago    Up 3 minutes                0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
d2492849275c   redis          "docker-entrypoint.s…"   41 minutes ago   Up 41 minutes               0.0.0.0:1234->6379/tcp, :::1234->6379/tcp              charming_ellis
cc71914c7778   ubuntu:16.04   "/bin/bash"              55 minutes ago   Exited (0) 55 minutes ago                                                          dazzling_jackson

→ -a 옵션을 추가하면 맨 처음에 실행했다가 종료된 컨테이너도 추가로 보인다.(여기선 ubuntu) 컨테이너는 종료되어도 삭제되지 않고 남아있다. 종료된 건 다시 시작할 수 있고 컨테이너의 읽기/쓰기 레이어는 그래도 존재합니다.
명시적으로 삭제해주어야 깔끔하게 컨테이너가 제거됩니.

컨테이너 중지하기(stop)

→ 실행중인 컨테이너를 중지하는 명령어

docker stop

docker ps # 중지하고 싶은 컨테이너의 ID 확인
docker stop ${CONTAINER_ID} # 컨테이너 ID로 컨테이너 중지, 띄어 쓰기로 여러개 중지 가능
docker ps -a # 중지된 컨테이너 확인

컨테이너 제거하기(rm)

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

docker rm

docker ps -a # 삭제하고 싶은 컨테이너의 ID 확인
docker rm ${CONTAINER_ID} # 컨테이너 ID로 컨테이너 삭제, 띄어 쓰기로 여러개 삭제 가능
docker ps -a # 삭제되었는지 확인

이미지 목록 확인하기(images)

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

docker images

docker images

#output
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       3147495b3a5c   6 days ago      431MB
redis        latest    3edbb69f9a49   2 weeks ago     117MB
ubuntu       16.04     b6f507652425   11 months ago   135MB

→ 이미지가 너무 많이 쌓이면 용량을 차지하기 때문에 사용하지 않는 이미지는 지우는 것이 좋습니다!

이미지 다운로드하기(pull)

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

docker pull

# ubuntu:14.04 이미지 다운로드
docker pull ubuntu:14.04C

이미지 삭제하기(rmi)

→ 이미지를 삭제하는 명령어

docker rmi

docker images # 삭제하고 싶은 이미지 아이디 확인
docker rmi ${IMAGE_ID} # 이미지 아이디로 이미지 삭제

컨테이너 로그 보기(logs)

→ 컨테이너가 정상적으로 동작하는 확인하는 좋은 방법은 로그를 확인하는 것으으로 로그를 확인하는 방법은 다음과 같습니다.

docker logs

docker ps # 로그를 확인하고 싶은 아이디 찾기
docker logs ${CONTAINER_ID} # 특정 컨테이너 ID의 로그 보기

컨테이너 명령어 실행하기(exec)

→ 컨테이너를 관리하다 보면 실행중인 컨테이너에 들어가보거나 컨테이너의 파일을 실행하고 싶을 때가 있는데, 이 때 exec 명령어를 사용하면 됩니다.
run과 유사해보이는데, 차이는 run은 새로 컨테이너를 만들어서 실행하고 exec는 실행중인 컨테이너에 명령어를 내리는 정도입니다.

docker exec

# exec 활용 예시

# 키보드 입력이 필요하니 -it 옵셔을 주고, bash쉘로 접속하여
# 가상머신에 접속한 것과 같은 느낌을 준다.
docker exec -it mysql /bin/bash

# MySQL test
$ mysql -uroot

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wp                 |
+--------------------+
5 rows in set (0.00 sec)

mysql> quit
exit

컨테이너 업데이트

  • 도커에서 컨테이너를 업데이트 하려면 새 버전의 이미지를 다운(pull)받고 기존 컨테이너를 삭제(stop, rm)한 후 새 이미지를 기반으로 새 컨테이너를 실행(run)하면 됩니다.
  • 컨테이너를 삭제한다는 것은 컨테이너에서 생성된 파일이 사라진다는 것이고, 그게 만약 DB라면 그동안 쌓였던 데이터가 모두 없어진다는 것입니다.
  • 이런 상황을 방지하기 위해 컨테이너 삭제시 유지해야 하는 데이터는 반드시 컨테이너 내부가 아닌 외부 스토리지에 저장해야 합니다.
    가장 좋은 방법은 AWS S3같은 클라우드 서비스를 이용하는 것이고 그렇지 않으면 데이터 볼륨을 컨테이너에 추가해서 사용해야 합니다.
  • 데이터 볼륨을 사용하면 해당 디렉토리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않습니다.
  • 데이터 볼륨을 사용하는 방법은 여러가지가 있지만 여기서는 호스트이 디렉토리를 마운트해서 사용하는 방법을 사용할 것입니다.
# before
docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

# after
docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  -v /my/own/datadir:/var/lib/mysql \ # <- volume mount
  mysql:5.7

→ 위의 예시는 /my/own/datadir 디렉토리를 컨테이너의 /var/lib/mysql 디렉토리로 마운트 하였고, 이제 데이터베이스 파일은 호스트이 /my/own/datadir 디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않습니다.
최신 버전의 MySQL 이미지를 다운받고 다시 컨테이너를 실행할 때 동일한 디렉토리를 마운트 한다면 그대로 데이터를 사용할 수 있습니다.

Docker Compose

→ 지금까지 도커를 커맨드라인에서 명령어로 작업했는데, 지금 당장은 간단한 작업만 했기 때문에 명령이 길지 않지만 컨테이너 조합이 많아지고 여러가지 설정이 추가되면서 명령어가 금방 복잡해집니다.
도커는 이와 같은 복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용한 Docker Compose라는 툴을 제공합니다.

설치

# docker compose 다운로드
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

# 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 잘 다운로드 되었는지 버전 확인
docker-compose version

사용(WordPress만들기 예시)

# 디렉토리 생성 후 이동
mkdir wp
cd wp

# yml 파일 하나 만들기
vi docker-compose.yml

# yml 파일 안에 아래와 같이 복붙
version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - wp_data:/var/www/html
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
    wp_data:

# 저장 후 나와서 컴포트 실행
docker-compose up

참조

'Docker' 카테고리의 다른 글

도커를 써야하는 이유는 뭘까?  (0) 2022.10.03