Docker実践ガイド|削除コマンド・Dockerfile作成・Composeで環境構築
/ 8 min read
Table of Contents
はじめに
Dockerについて個別に書いてきたメモを、1本の実践ガイドにまとめ直しました。
削除まわりのコマンド、Dockerfileを作るときの進め方、Composeの停止コマンドの違い、そして実際に組んだ環境例が2つという構成です。
インストール手順とコマンド一覧は別記事にまとめてあるので、そちらを参照してください。
イメージとコンテナを削除する
コンテナを削除する
コンテナは停止してからでないと削除できません。まず状態を確認します。
# 稼働中のコンテナを確認する$ docker ps
# 稼働中なら停止する$ docker stop コンテナID
# 停止中のものも含めて確認する$ docker ps -a
# 停止を確認してから削除する$ docker rm コンテナIDイメージを削除する
イメージを消すには、先にそのイメージを使っているコンテナを消しておく必要があります。
# イメージを確認してIDを調べる$ docker images
# イメージを削除$ docker rmi イメージIDまとめて片付ける
1つずつ消すのが面倒なときは prune 系が早いです。
# 停止中のコンテナを全削除$ docker container prune
# 使われていないイメージを削除$ docker image prune
# 停止中コンテナ・未使用ネットワーク・danglingイメージ・buildキャッシュを一括削除$ docker system prune -adocker system prune -a はディスクがすぐ空きますが、消える範囲が広いので、残したいイメージがないか確認してから実行してください。
Dockerfileはトライ&エラーで作る
Dockerfileを1行書くたびに docker build していると、待ち時間ばかりで進みません。
先に対話モードでコンテナに入り、動くコマンドを確定させてからDockerfileに書き写すほうが速いです。
$ docker run -it ubuntu:18.04 /bin/bashこの中で apt install ... などを実際に叩いて、通ったものだけを RUN に落としていきます。ビルドを待つ回数が激減します。
docker compose stop と down の違い
| コマンド | 挙動 |
|---|---|
docker compose stop |
コンテナを停止する。削除はしない |
docker compose down |
コンテナとネットワークを削除する |
stop したものは docker compose start で再開できます。down した場合は up からやり直しです。
down のオプションもあわせて覚えておくと便利です。
--rmi all # 全イメージの削除--volumes # volumesに記載したvolumeを削除--remove-orphans # compose.ymlで定義していないコンテナも削除起動側のオプションはこの2つをよく使います。
-d # バックグラウンドで実行(同じターミナルを使い続けられる)--no-recreate # コンテナがすでに存在していれば再生成しない環境構築例1:Go言語
軽量なalpineベースでGoの環境を作ります。
Dockerfile
FROM golang:alpineRUN apk add --update && apk add gitRUN mkdir /go/srcWORKDIR /go/srcADD . /go/srccompose.yml
services: goapp: build: . tty: true volumes: - ./go/src:/go/src # ホストのフォルダパス:コンテナのフォルダパスtty: true を入れておかないと、何もしないコンテナはすぐ終了してしまいます。
起動と実行
$ docker compose up -d --build
# docker compose exec サービス名 コマンド$ docker compose exec goapp go run hello.go
# コンテナに入ってから実行する場合$ docker compose exec goapp /bin/sh>>> go run hello.go環境構築例2:FastAPI + PostgreSQL + pgAdmin
API・DB・管理画面の3つをまとめて立ち上げる構成です。
フォルダ構成
fastapi-dev├── compose.yml└── fastapi ├── app │ ├── database.py │ ├── main.py │ └── models.py ├── Dockerfile └── requirements.txtcompose.yml
services: fastapi: build: context: ./fastapi volumes: - ./fastapi/app/:/app/ container_name: fastapi command: uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000 ports: - 8000:8000 environment: - DATABASE_URI=postgresql://postgres:postgres@postgres/postgres_db depends_on: - postgres restart: always
postgres: image: postgres:alpine volumes: - postgres_data:/var/lib/postgresql/data/ container_name: postgres ports: - 5432:5432 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=postgres_db hostname: postgres restart: always
pgadmin4: image: dpage/pgadmin4:latest volumes: - pgadmin4_data:/var/lib/pgadmin container_name: pgadmin4 ports: - 8080:80 environment: PGADMIN_DEFAULT_EMAIL: pgadmin4@test.com PGADMIN_DEFAULT_PASSWORD: pgadmin4 hostname: pgadmin4 depends_on: - postgres restart: always
volumes: postgres_data: pgadmin4_data:接続先のホスト名にコンテナ名(postgres)を書ける点がポイントです。Composeが同じネットワークに入れてくれるので、IPアドレスを気にせず名前で解決できます。
Dockerfile
FROM python:alpine
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /app/requirements.txt
# ビルドに必要なパッケージを入れて、入れ終わったら消すRUN apk add --no-cache postgresql-libs \ && apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev \ && python3 -m pip install -r /app/requirements.txt --no-cache-dir \ && apk --purge del .build-deps
COPY . /app/.build-deps にまとめてから最後に消すことで、イメージサイズを抑えられます。
requirements.txt
fastapiuvicorndatabases[postgresql]SQLAlchemyalembicpsycopg2アプリ側のコード
from sqlalchemy import create_enginefrom sqlalchemy.orm import declarative_base, sessionmaker
# postgresql://{user}:{password}@{host}:{port}/{database}engine = create_engine( "postgresql://postgres:postgres@postgres:5432/postgres_db", echo=True)
Base = declarative_base()
SessionLocal = sessionmaker(bind=engine)from sqlalchemy import Boolean, Column, DateTime, Integer, String, Text
from database import Base
class Item(Base): __tablename__ = "items"
id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(255), nullable=False, unique=True) description = Column(Text) date = Column(DateTime) on_offer = Column(Boolean, default=False)from fastapi import Depends, FastAPIfrom sqlalchemy.orm import Session
import modelsfrom database import Base, SessionLocal, engine
app = FastAPI()
Base.metadata.create_all(engine) # テーブル作成
def get_db(): db = SessionLocal() try: yield db finally: db.close()
@app.get("/items/")def all_fetch(db: Session = Depends(get_db)): return db.query(models.Item).all()実行
$ docker compose up -d --buildホストのブラウザから http://localhost:8000/docs を開くと、FastAPIの自動生成ドキュメントから動作確認ができます。pgAdminは http://localhost:8080 です。
おわりに
Dockerは覚えることが多く見えますが、実際に手を動かすときに使うコマンドはかなり限られています。
削除まわりと stop / down の違いさえ押さえておけば、あとは環境ごとにcompose.ymlを書き足していくだけです。
