일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- useQuery
- 메서드명
- Jenkins
- jacoco
- 회고
- Blue-Green
- 계층별 구조
- BalancedTree
- 블로그 병행
- useMutation
- 우테코
- 클래스
- SQL 실행순서
- 어댑티브 해시 인덱스
- 프리코스
- B+TREE
- db
- 월간회고
- 기능별 구조
- InnoDB 버퍼 풀
- N+1
- mysql
- 도커
- DeleteAll
- 카카오 2차 코딩테스트
- 멀티쓰레드 프로그래밍
- 주간회고
- 백기선 스터디
- ci/cd
- java
- Today
- Total
Haneul's Blog
도커 튜토리얼(Amazon Linux 기준) 본문
도커 설치하기
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...]
자주 사용하는 옵션들
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 |
---|