[출처] 유데미 - Docker & Kubernetes : 실전가이드
출처
grep docker /etc/groupsudo usermod -aG docker vagrantname : 이미지의 고유 식별자 (=프로그램 이름)
tag : name 안에서 사용되는 고유 식별자 (=버전)
이미지 태그 부여 방법
. ← 현재 디렉토리Docker Image의 tag 변경 방법
# 변경할 태그는 생략할 경우 자동으로 lastest로 설정
docker tag <기존 리포지토리 이름>:<기존 태그> <변경할 리포지토리 이름>:<변경할 태그>
# tag 변경 후 Docker Hub에 업로드(Docker id 로그인 필요)
docker tag <기존 리포지토리 이름>:<기존 태그> <Docker id/리포지토리 이름>:<변경할 태그>
docker push <Docker id/리포지토리 이름>
단, 이전에 이미지를 실행한 이력이 있으면 이미지의 업데이트 여부를 확인하지 않고 당시 이미지를 기준으로 컨테이너가 실행되기 때문에 업데이트가 있는지 확인이 필요한 경우 pull을 한 뒤 run을 해야한다.
Docker 이미지 → 컨테이너 생성 예제
# f-node 이미지로 컨테이너를 생성하며 포트는 외부 3000번 포트를 통해
# 내부 80포트로 연결될 수 있도록 설정하고 detach 모드로 실행
# 생성되는 컨테이너의 이름은 f-app이며 컨테이너가 중지됨과 동시에 컨테이너는 사라진다.
docker run -p 3000:80 --rm -d --name f-app f-node
-v VOL_NAMEdocker volume rm VOL_NAME 또는 docker volume prune 을 통해 익명 볼륨을 삭제 해야한다.-v HOST_NAME:VOL_NAME/var/lib/docker/volumes/<VOL_NAME>/_data 에 위치docker run -v <VOL_NAME>:/tmp:ro --rm -it centos:7-v HOST_ABS_PATH:VOL_NAME-v HOST_ABS_PATH:VOL_NAME:ro : read only 읽기 전용 모드-v $(pwd):/app-v "%cd%":/app.git, Dockerfile 등 이미지에 필요 없는 파일을 제외docker network create --subnet 192.168.100.0/24 --gateway 192.168.100.254 net1docker network inspect <NETWORK NAME>docker network connect <NETWORK NAME> <CONTAINER NAME>컨테이너 ↔ 로컬 호스트
localhost를 host.docker.internal 로 대체하면 컨테이너와 호스트의 통신이 가능하다.docker container inspect <CONT_NAME> 을 입력 후 NetworkSettings를 참조하면 해당 컨테이너의 IP를 알 수 있으며 이를 이용해 컨테이너끼리 통신할 수 있다.--network <NET_NAME> 옵션을 통해 여러 컨테이너를 하나의 네트워크로 묶을 수 있다.docker network create <NET_NAME> 을 통해 도커 내부 네트워크를 만들어 둔 상태로 생성해야 사용이 가능하다.localhost(=127.0.0.1) -> <CONT_NAME> 처럼 IP 대신 컨테이너 이름을 넣어주면 네트워크 내부 컨테이너 사이의 통신이 가능하다.docker run -itd -e VARS="HI" --name NAME IMAGE:TAGdocker exec -it -e VARS="Hi" NAMEdocker stats - 실시간 리소스 확인-a : 모든 컨테이너--no-stream : 스트리밍 Xdocker top <CONTAINER NAME>docker kill --signal=9 my_containerdocker run -it --name os --cpus 0.3 centosdocker run -it --name os --memory 1024m centosdocker run --memory-swap 1024m osdocker update --memory 1024m <CONTAINER NAME>docker attach - shell이 실행 중인 컨테이너에 접근하고 싶을 때CTRL+P + CTRL+Q 를 눌러 컨테이너에서 강제 탈출을 할 수 있다.docker exec - 실행 중인 컨테이너에서 명령을 실행docker exec os ip addr showdocker diff <CONTAINER NAME> - 컨테이너 파일 변경 상태 체크docker image save/load - 호스트에 저장된 이미지를 아카이브 파일로 복사docker image save -o centos7.tar centos:7docker image save centos:7 > centos7.tardocker image save centos:7 httpd:latest mysql:5.7 > all_image.tartar tf centos7.tar - tar 의 내용 확인docker image load -i centos7.tardocker image load < centos7.tardocker container commit - 컨테이너를 이미지로 변환docker container commit test_img:0.0.1docker container import/export - 컨테이너의 파일 시스템을 아카이브 파일로 추출 ↔ 복원docker container export os1 -o export.tardocker container export os1 > export .tardocker image import export.tar export:0.0.1docker run -itd --name os2 exp:0.0.1 bash 처럼 실행 시 강제로 Shell을 실행하면 작업 가능# Host -> Container로 파일 이동
docker cp <호스트 경로> <컨테이너 이름or컨테이너ID>:<컨테이너 경로>
# Container -> Host 파일 이동
docker cp <컨테이너 이름or컨테이너ID>:<컨테이너 경로> <호스트 경로>
| 지시어 | 설명 |
|---|---|
| FROM | 베이스 이미지 지정 |
| ENV | 컨테이너 환경 변수 지정 |
| WORKDIR | 컨테이너 작업 디렉토리 지정 |
| EXPOSE | 컨테이너 포트 지정 |
| ADD | 이미지 생성 시 파일 추가(상대경로) |
| ENTRYPOINT | 컨테이너의 애플리케이션 지정 |
| LABEL | 이미지 메타데이터 추가 |
| USER | 컨테이너 사용자 지정(이미지 내 유저가 사전생성되어야 함) |
| RUN | 작업할 명령 지정 |
| VOLUME | 컨테이너 볼륨 지정 |
| COPY | 이미지 생성 시 파일 복사 |
| CMD | 컨테이너의 애플리케이션 지정 |
# rocky9 리눅스에서 http 서비스를 실행 했던 순서
dnf install -y httpd
vi /etc/httpd/conf/httpd.conf
vi /var/www/html/index.html
systemctl start httpd
firewall-cmd --add-service=http
FROM centos:7
RUN yum install -y httpd
VOLUME /etc/httpd/conf.d
EXPOSE 80/tcp
COPY index.html /var/www/html
WORKDIR /var/www/html
CMD /usr/sbin/httpd -D FOREGROUND # 컨테이너에서 systemctl 제한
docker pull registry:2docker run -d -p 5000:5000 --name registry registry:2docker image tag centos:latest localhost:5000/mycentos:v1 - 이미지 태그 변경docker push localhost:5000/mycentos:v1 - 이미지 업로드{ "insecure-registries" : ["<HOST IP>"] }sudo systemctl restart dockersudo ./install.shdocker login <HOST IP> - 성공 시 Login Succeeded 를 확인할 수 있다.docker tag centos:latest <HOST IP>/libriry/docker:centos 이미지 태그 변경docker push <HOST IP>/library/docker:centos 이미지 업로드FROM golang
COPY hello.go .
RUN go build hello.go
CMD go run hello.goGo 같은 컴파일 언어는 빌드한 실행 파일이 존재할 때 scratch 이미지를 사용해 용량을 최소화 하면서 같은 결과를 사용할 수 있다.
FROM scratch
WORKDIR /app
COPY hello .
CMD ./hello
FROM golang AS build
COPY hello.go .
RUN go build hello.go
FROM scratch
COPY --from=build /go/hello /
CMD ./helloversion: "3.8"
services:
<SERVICE1>:
image: <IMG_NAME>
volumes:
- <SERVICE_PATH> # Anonymous volume
- <HOST_PATH>:<SERVICE_PATH> # Named volume
environment:
- <ENV_NAME1>:<VAR1>
- <ENV_NAME2>:<VAR2>
env_file:
- <RELATIVE PATH> # docker-compose.yaml 기준의 상대 경로
ports:
# 포트번호가 1개만 입력되는 경우 내부포트 설정
- '80:80'
depends_on:
# 해당 서비스가 다른 서비스에 의존성을 가질 경우 표기
- <SERVICE_NAME>
- ...
# -i
stdin_open: true
# -t
tty: true
# 컨테이너의 이름을 직접 짓고 싶을 떄 사용
container_name: <VAR_NAME>
<SERVICE2>:
build:<REALTIVE PATH> #이미지를 빌드하기 위한 Dockerfile의 경로
...
volumes:
<VOL_NAME>: # Named volume만 기재
docker-compose up 을 입력하면 서비스가 실행되며 docker-compose up -d 를 하면 서비스를 백그라운드에서 실행할 수 있다.docker-compose down 을 입력하면 서비스가 종료되며 docker-compose down -v 를 입력하면 서비스에서 생성됐던 볼륨까지 같이 삭제가 된다.HTTP + DB
name: compose_test
services:
web01:
image: httpd
scale: 2 # container_name: webserver # scale 시 container_name을 사용 할 수 없음
ports:
- 80 # port 포트포워딩이 외부까지 세팅 된 경우 포트가 겹쳐 scale 불가
dbserver:
container_name: database
image: mysql:5.7
ports:
- 3306
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- type: volume
source: db-data
target: /var/lib/mysql
# - db-data:/var/lib/mysql
volumes:
db-data:
docker-compose scale <SERVICE NAME>=N : 특정 서비스를 N개 만큼 생성WordPress + MYSQL
docker 컨테이너를 이용한 실습
MYSQL
docker run --name db --network wp-net -p 8080:80 -v db-vol:/var/lib/mysql -d \ ✔ vagrant@rocky9
> -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_USER=wp-user -e MYSQL_PASSWORD=123 \
> -e MYSQL_DATABASE=wp-db mysql:5.7
WordPress
docker run -d --name wp --network wp-net -v wp-vol:/var/www/html \
-e WORDPRESS_DB_USER=wp-user -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_NAME=wp-db \
-e WORDPRESS_DB_HOST=db wordpress
docker-compose.yaml 로 구현
version: '3.1'
services:
wordpress:
container_name: wp
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp-user
WORDPRESS_DB_PASSWORD: 123
WORDPRESS_DB_NAME: wp-db
volumes:
- wp-vol:/var/www/html
depends_on:
- db
networks:
- wp-net
db:
container_name: db
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wp-db
MYSQL_USER: wp-user
MYSQL_PASSWORD: 123
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db-vol:/var/lib/mysql
networks:
- wp-net
volumes:
wp-vol:
db-vol:
networks:
wp-net: