❓ Information
- docker 명령어 모음
❗ Relevant data
📦 Information Resources
🔰 Content -> e로 image 만들기
- Dockerfile 생성
FROM ubuntu:latest
RUN apt update
RUN apt install -y git
- image 생성
$ docker build -t ubuntu:git .
-t 는 이미지 이름을 지정하는 옵션
Docker image 이름 변경
- image 이름 추가
$ docker tag ubuntu:git tools:git
- image 목록 확인
$ docker images | grep git
tools git bb7aff0f9054 5 minutes ago 284MB
ubuntu git bb7aff0f9054 5 minutes ago 284MB
- 기존 이미지 삭제
$ docker rmi ubuntu:git
Untagged: ubuntu:git
- 확인
$ docker images | grep git
tools git bb7aff0f9054 5 minutes ago 284MB
Docker Hub에 image push
- docker login
$ docker login
- image 이름 형식 갖추기 (갖추고 있으면 스킵)
$ docker tag tools:git roxanne0808/tools:git
- docker hub 에 push
$ docker push roxanne0808/tools:git
The push refers to repository [docker.io/roxanne0808/tools]
7d81155787e6: Pushed
aa9581a8697c: Pushed
e4da4fde4d34: Pushed
d9d352c11bbd: Pushed
git: digest: sha256:65ea5d71c13b7e9eb7ae90b95f290191e129410906cae3f18cc29d8caadcaf1e size: 855
- 이제 누구나 pull 받을 수 있음
$ docker pull roxanne0808/tools:git
Docker 명령어 형식
docker <SUBCOMMAND> (<OPTIONS>)
ps -a 에서 필터링
$ docker ps -a --filter volume=mysql_data
run 명령어 형식
docker run (<OPTIONS>) <IMAGENAME> (<COMMAND>)
백그라운드 실행
$ docker run -d --name nginx-8080 -p 8080:80 nignx
퍼블리시
- html 파일을 서빙하는 nginx 예시를 들겠다.
마지막에
:ro는, 컨테이너에서 이 디렉터리에서 쓰기를 할 수 없도록 읽기 전용으로 마운트하라는 의미
$ cd wherever
$ vi index.html
<html>
<h1>Hello World</h1>
</html>
$ docker run -d --name nginx-static -p 8080:80 -v $(pwd):/usr/share/nginx/html:ro nginx
셸을 실행하거나 명령어 출력을 바로 보고 싶을 때
-it옵션 필요
$ docker run -it debian:12 bash
Container 종료 시 Container 삭제
--rm옵션 필요
$ docker run -it --rm debian:12 bash
Volume 추가
-v옵션 필요
# Windows
$ docker run -it --rm -v ${pwd}:/data linuxserver/ffmpeg:latest
# macOS / Linux
$ docker run -it --rm -v $(pwd):/data linuxserver/ffmpeg:latest
[호스트의 디렉터리]:[컨테이커 내부의 디렉터리]
포터블 앱으로 사용
- ffmpeg를 예시로 들겠다.
--rm으로 명령어 실행 이후 컨테이너 삭제-v로 볼륨 연결 해당 이미지는 Entrypoint를 제공해서 명령어 맨 앞에 ffmpeg를 붙이면 안됨
$ cd wherever
$ wget https://www.lainyzine.com/ko/images/docker-logo.png
$ docker run -it --rm \
-v $(pwd):/data \
linuxserver/ffmpeg:latest \
-loop 1 -i /data/docker-logo.png -c:v libx264 -t 15 -pix_fmt yuv420p -vf scale=320:240 /data/docker-logo.mp4
DB server 로 사용
- MySQL 서버를 예시로 들겠다.
-e는 환경변수 설정하는거다. root 유저를 pw: 1234로 생성하는 명령이다. 생성 전에 사용 가능한 port인지 확인하고 쓸것. 왜냐면 사용중인 port에 매핑 했는데 오류가 안나는 경험을 함…
$ docker run -d --name mysql \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:9.3
Container 중지/삭제 명령어
$ docker stop <CONTAINER> -- 종료
$ docker container kill <CONTAINER> -- 강제종료
$ docker rm <CONTAINER> -- 삭제
$ docker rm -f <CONTAINER> -- 종료 및 삭제
$ docker container prune -- 중지된 모든 container 삭제
Container Log 명령어
전체 log 한번만 출력
$ docker logs <CONTAINER>
최근 로그 10줄 출력하고 대기
$ docker logs -n 10 -f <CONTAINER>
같은 방식으로 docker compose 파일이 있는 디렉터리에서 로그 확인 가능
$ docker compose logs
docker-compose
docker-compose.yml 예시
services:
mysql:
image: mysql:8.0
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_RANDOM_ROOT_PASSWORD: true
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: awesome-wordpress-password
wordpress:
depends_on:
- mysql
image: wordpress:latest
ports:
- "3000:80"
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: awesome-wordpress-password
volumes:
mysql-data:
compose 파일 실행/종료
컨테이너를 실행/종료 한다고 보면 됨
$ docker compose up -d
$ docker compose down
코드를 수정한 경우 --build를 붙여야 변경 사항이 반영됨
docker-compose up -d→ 이미지 그대로, 실행만.docker-compose up --build -d→ 이미지 빌드 후 실행.docker-compose build --no-cache→ 특별히 캐시 무시할 필요 있을 때만 사용 (requirements나 base image 꼬였을 때).
이렇게 실행하면 컨테이너 이름이 이렇게 생길거임
wordpress-mysql-1wordpress-wordpress-1
<디렉터리 이름>-<서비스이름>-<자동으로 붙는 인덱스>
compose 명령 옵션
# Detached mode
$ docker-compose up -d
# Build images
# 소스 수정 이후 container 다시 올릴때 사용
$ docker-compose up --build -d
# stop and recreate all containers
$ docker-compose up --force-recreate -d# Build images without cache
# 패키지 버전을 최신화 하는게 필요하거나 빌드 오류가 난 경우 사용
$ docker-compose build --no-cacheNetwork 명령어
inspect
# 네트워크 조회
$ docker network ls
# 네트워크 생성
$ docker network create my-network
# 네트워크 상세 정보 확인
$ docker network inspect my-networkconnect/disconnect
$ docker network connect {network name} {container name}
$ docker network disconnect {network name} {container name}
# connection test
$ docker exec {container name} ping {container name}prune
# 미사용 네트워크 청소
$ docker network pruneVolume 명령어
create
$ docker volume create {volume name}ls
$ docker volume lsinspect
# Mountpoint 항목을 보면 해당 볼륨이 컴퓨터의 어느 경로에 생성되었는지 확인 가능
$ docker volume inspect {volume name}
[
{
"CreatedAt": "2020-05-09T17:03:46Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/our-vol/_data",
"Name": "our-vol",
"Options": {},
"Scope": "local"
}
]inspect
$ docker inspect {volume name}rm
$ docker volume rm {volume name}prune
$ docker volume prune컨테이너 상에서 볼륨을 영구적으로 사용할 수 있는 방법
1. 호스트 볼륨 공유
호스트 디렉토리를 컨테이너 내에 마운트
# MYSQL 컨테이너 실행
$ docker run -d --name wordpressdb_hostvolume \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=workpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
# 워드프레스 웹 서버 컨테이너 생성
$ docker run -d \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress_hostvolume \
--link wordpressdb_hostvolume:mysql \
-p 80 \
wordpress-v 옵션으로 /home/wordpress_db:/var/lib/mysql로 설정
호스트의 /home/wordpress_db 디렉터리와 컨테이너의 var/lib/mysql 디렉터리를 공유한다는 뜻
2. 볼륨 컨테이너
내 생각에는 거의 안쓸거 같아서 패스
3. 도커 볼륨
# create volume
$ docker volume create {volume name}
# mount volume
$ docker run -d \
--name test-mysql \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=test-mysql \
-p 3306:3306 \
-v {volume name}:/var/lib/mysql \
mysql:5.7Docker image 의 태그 규칙
docker-library 공식 문서를 보면 몇몇 이미지에서 동일한 tag 규칙을 따르며 배포 함
- name:version
- name:version-slim
- name:version-alpine
- name:version-windowsservercore
name:version
가장 기본이 되는 이미지. 배포 뿐 아니라 base 이미지로 사용되기 위해서 설계됨.
뒤에 buster, stretch 가 붙는 경우
Debian 계열 이미지를 베이스로 배포 되었음. 이미지가 어떤 릴리즈를 기반으로 배포 되었는지 알 수 있는 척도. 이 안에 몇가지 패키지를 추가로 설치하고 싶을 때 배포 시 발생하는 에러를 최소화 하기 위해서는 명시한것임.
name:version-slim
파이썬을 실행하는데 필요한 최소한의 패키지만 설치됨. 순수하게 파이썬만 실행할 수 있는 이미지. 따라서 배포 환경에 용량 제한이 심하거나 순수하게 파이썬만 실행하는 환경이 아니라면 사용하지 않는것이 좋다.
name:version-alpine
alpine linux 를 기반으로 제작된 이미지. alpine 은 OS 용량 자체가 매우 작기로 유명함. 주의할점: alpine 은 glibc 가 아니라 musl libc 를 사용하기 때문에 가끔 C 라이브러리 의존성에 이슈가 있을수 있다는 단점이 있다.
name:version-windowsservercore
windows server 이미지를 기반으로 배포 되었다.