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

https://www.docker.com/products/docker-desktop

※  PC の OS にあったものを install する

docker-desktop

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