🐳
Docker docker-compose についてまとめておく
Docker docker-compose についてまとめておく
22.04.07 更新
Concept
[ Build Once, Run Anyware ]
Role
Docker コンテナ内で開発することで OS が違っても、動作環境が統一され、アプリケーションが問題なく動作可能になる
BestPractice
- 1コンテナ1プロセス
- 軽量な Docker image にする
- 実行ユーザーは root 以外にする
- Immutable Infrastructure な image にする
Install
- 公式 HP から install
※ PC の OS にあったものを install する
Docker command
Basic commands
- docker ps -a
- docker images
- docker volume ls
- docker exec -it
<ContainerName>
bash - docker rm
<ContainerName>
- docker rmi
<ImageName>
- docker volume rm
<VolumeName>
- docker container prune
- dokcer image prune
- docker volume prune
Docker Hub 上にある docker image を pull する
docker pull <imageName>:<tag>
(ex.)
docker pull node:14.15.4-slim
local に所有している docker image から docker container を作成する
存在しない場合は Docker Hub から pull されて run される
docker run node:14.15.4-slim
local に所有している docker image の確認方法
docker images
local に所有している docker container の確認方法
docker ps
docker ps -a
option ( -a ) を付けることで全て表示できる
exited 状態の docker container を running させる
docker restart <ContainerID>
running 状態の docker container に入る
docker exec -it <ContainerID> bash
編集した docker container から新しい image を local に作成する
docker commit <ContainerID> <NewImageName>:<tag>
tag を付けられる。Default は latest になる
docker image の複製時に tag を指定する
docker tag <imageName>:<tag> <NewImageName>:<tag>
docker image を docker hub に push する
docker push <userName>/<ImageName>:<tag>
docker hub から original image を pull する
docker pull <username>/<imageName>:<tag>
docker container の削除
docker rm <containerName>
ID でも OK
docker image の削除
docker rmi <imageName>
ID でも OK
local に volume された docker volume の確認方法
docker volume ls
たまに確認するとめちゃくちゃゴミが溜まってる
-
rm
で削除が可能
docker volume rm <target>
local に構築された docker network の確認方法
docker network ls
-
rm
で削除が可能
docker network rm <target>
docker system prune(一括削除)
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache(これめっちゃ溜まる)
docker system prune
docker image の取得
docker search <imageName>
docker container から抜けるショートカットコマンド
exit -> ctrl + d
detach -> ctrl + p + q
detach で抜けると container のプロセスを切らずに出られる(動かしたまま)
- detach 後に再度 container に入る
docker attach <ContainerName>
Dockerfile
Sample
FROM node:16.13.0-slim
RUN apt-get update && apt-get install -y \
sudo curl vim wget procps \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
ENV NEXT_TELEMETRY_DISABLED=1
ENV USER_NAME=node
ENV USER_UID=1000
ARG wkdir=/home/${USER_NAME}/app
WORKDIR ${wkdir}
COPY ./app/package*.json /home/${USER_NAME}/app/
COPY ./app/yarn.lock /home/${USER_NAME}/app/
COPY ./app/ /home/${USER_NAME}/app/
RUN yarn install
RUN yarn build
RUN echo "root:root" | chpasswd \
&& usermod -aG sudo ${USER_NAME} \
&& echo "${USER_NAME}:${USER_NAME}" | chpasswd \
&& echo "%${USER_NAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/${USER_NAME} \
&& chmod 0440 /etc/sudoers.d/${USER_NAME} \
&& chown -hR ${USER_NAME}:${USER_NAME} ${wkdir}
USER ${USER_NAME}
# CMD [ "yarn", "start" ]
- Dockerfile から docker image, container を作成、操作する
docker build -t <image name>:<tag name> (path)
ex.)
docker build -t practice:latest .
docker-compose
Basic commands
- docker-compose up
- docker-compose up -d
- docker-compose up -d --build
- docker-compose exec
<ServiceName>
bash - docker-compose stop
- docker-compose restart
- docker-compose down
Sample
version: '3.3'
services:
frontend:
image: ${IMAGE_BASENAME}/ui:${TAG}
container_name: ${CONTAINER_BASENAME}-ui
build:
context: .
dockerfile: Dockerfile
volumes:
- ./app:/home/node/app
- frontend-volume:/home/node/app/node_modules
ports:
- ${FRONTEND_PORT}:3000
tty: true
restart: always
volumes:
frontend-volume:
name: ${CONTAINER_BASENAME}-volume
driver: local
container image volume network 一括削除
docker-compose down --rmi all --volumes --remove-orphans
Practices
HelloWorld image の pull と run
docker pull hello-world
docker run hello-world
処理結果
docker ( 🍇 ) :$ docker run -it hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
ubuntu image を使う
docker run -it ubuntu bash
- container に名前を付ける
docker run -it --name tests ubuntu bash
- container が running -> exited になったら削除する
docker run --rm -it --name tests ubuntu bash
- container を detached で run させる
docker run -d -it --name tests ubuntu bash
ubuntu image を Docker Hub へ Push, Pull
- docker image を run
docker run -it --name sample ubuntu bash
- test ファイルを作成
pwd
touch test
- container から image を作成
docker commit <ContainerID> ubuntu:v1
- image から image を名前を変えて複製
docker tag ubuntu:v1 <NewImageName>:<tag>
(ex.)
docker tag ubuntu:v1 yt0323/my-practice:v2
<NewImageName>は Docker Hub Repository Name と合わせる
- image を Docker Hub に Push
docker push yt0323/my-practice:v2
- Docker Hub から image を pull
docker pull yt0323/my-practice:v2
docker run yt0323/my-practice:v2
Discussion