Ubuntu ServerでDocker Engine + Compose
简介
GUIの無いUbuntu Server上でDocker使うのにメモ.
インストール・設定
インストール
Install Docker EngineのUbuntuを参考.
-
- 古いバージョンをアンイストール
-
- sudo apt remove docker docker-engine docker.io containerd runc
必須ソフトウェアインストール
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
GPGキー取得
sudo mkdir -m 0755 -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
リポジトリの設定
echo “deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker Engineインストール
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
動作確認
sudo docker run hello-world
docker composeはpluginなのでコマンドはdocker-composeではなくdocker composeとなる.
設定
设定以便普通用户可以使用。以下是针对当前用户的操作。如果想要针对其他用户进行操作,请更改$USER部分。
sudo groupadd docker && sudo usermod -aG docker $USER
運用
構築
Dockerfileの作成・イメージの作成・コンテナの作成と利用まで.
ディレクトリは以下の場所とし,dockerコマンドは以下の場所で実行するものとする.
- ~/Docker/
また参考にしたのは以下の記事.
-
- 効率的に安全な Dockerfile を作るには
- docker container / image コマンド新旧比較
-
- ベースイメージ,作成するイメージ名の決定
ベースイメージはFROMで指定するもので,軽量なLinuxが選ばれやすい?
ここでは例としてubuntu:22.04としている.
作成するイメージはDockerHubのアカウント名/イメージの名前:タグ名となる.タグ名は省略可で,その場合latestが付与されるっぽい.
ここでは例としてnek/mytestとする.
最小のDockerfile作成
~/Docker/Dockerfile
FROM ubuntu:22.04
CMD [“/bin/bash”]
初期イメージ作成
docker image build -t nek/mytest:latest .
作業用コンテナ作成&作業開始
端末Aにて,以下のコマンドで作業コンテナに入り,設定等行う.
docker container run -it –name mytest nek/mytest:latest bash
端末Bにて,Dockerfileを編集する.端末Aで行った作業を書いていく.
端末Aの作業が一段落したら以下のコマンドでイメージを更新する.
docker container commit mytest nek/mytest:latest
端末Aの作業してておかしなったら,端末Aにてexitしてdocker container runし直すと,最後のcommitから作業できる.
正式なイメージ作成
ちゃんと作成したDockerfileからイメージが出来るか確認するため,作業用のコンテナ・イメージを削除してビルド
docker container ls -alで調べたCONTAINER IDから削除
docker container rm
全コンテナ削除(無関係のものも削除するため使用に気をつける)
docker container rm `docker container ls -a -q`
IMAGE IDを調べつつ削除
docker image rmi
再ビルド
docker image build -t nek/mytest:latest .
コンテナ・イメージを削除するのによく使うコマンド類.
コンテナ・イメージの表示.オプション
-a
アクティブでないコンテナ(イメージ)も含めてls
imageの場合あまり関係ない?
-q
コンテナID・イメージIDのみ出力してくれるっぽい
コンテナ・イメージの削除.
docker container rm `docker container -a -q` # 全コンテナ一括削除
docker image rmi `docker image -a -q` # 全イメージ一括削除(-aはいらんけど,惰性で)
docker image prune # 再ビルドなどでタグが外れて<none>になったものを削除
docker system prune -a --filter "until=24h" # フィルタによる削除(例は24時間使用されていないイメージ削除)
通常利用
運用はdocker composeでやると楽.
とりあえずDockerfileと同じディレクトリにdocker-compose.ymlを用意.なんとなく良く使うものを以下に記載.
version: '3.9'
services:
mytest:
build: .
image: nek/mytest:latest
container_name: mytest
hostname: <ホスト名つけるなら>
ports:
# host:container
- **:** # ポート開放するなら**にポート番号を
restart: always # これやっとくとホストPCを再起動しても自動的にコンテナ起動してくれる
volumes: # このやり方はmount(bind?).volumeとtmpfsもあって種類は合わせて3つ
- /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro
在包含docker-compose.yml文件的位置,通过以下命令启动或停止容器。
-d
启动守护进程。
–build
根据docker-compose.yml中的build:进行构建。
docker compose down命令会停止并删除容器,同时也会删除通过docker compose up启动的容器。选项
-v
docker-compose.yml文件中的volumes项会删除命名卷容器所附加的匿名卷。
docker compose up -d
docker compose
使用.env文件
如果要重复使用docker-compose.yml文件,需要将各种参数变量化并在.env文件中写入变量内容以使用。例如,更改上述示例将变成以下方式。
version: '3.9'
services:
mytest:
build: .
image: nek/mytest:latest
container_name: ${CONTAINER_NAME}
hostname: <ホスト名つけるなら>
ports:
# host:container
- **:** # ポート開放するなら**にポート番号を
restart: always # これやっとくとホストPCを再起動しても自動的にコンテナ起動してくれる
volumes: # このやり方はmount(bind?).volumeとtmpfsもあって種類は合わせて3つ
- /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro
CONTAINER_NAME=mytest
其他
Dockerfile 的最小构建要素。
或许还可以有一些其他选择吗?
我知道你会做得很好。
FROM ubuntu:22.04
RUN set -x && \
apt update && apt upgrade -y
CMD ["/bin/bash"]
时区要正确设置
如果想将时间从通常的UTC改为JST,有两种方法。一种是在Dockerfile中安装和设置tzdate,另一种是挂载与时区相关的文件。
FROM ubuntu:22.04
RUN set -x && \
apt update && apt upgrade -y && \
DEBIAN_FRONTEND=noninteractive apt install tzdate # もしかしたらDEBIAN_FRONTEND=...いらないかな
ENV TZ=Asia/Tokyo
CMD ["/bin/bash"]
tzdateをインストールせず,timezone関係のファイルをマウントする場合,docker composeを使ってマウントする.その場合のdocker-compose.ymlの一部は以下の通り.より良い方法があれば情報求む.
version: '3.9'
services:
サービス名:
build: .
...
volumes:
- /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro
如果已经在讨论时区了,顺便也提一下语言。
FROM ubuntu:22.04
RUN set -x && \
apt update && apt upgrade -y && \
DEBIAN_FRONTEND=noninteractive apt install tzdate locales && \
locale-gen ja_JP.UTF-8
ENV TZ=Asia/Tokyo LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja
CMD ["/bin/bash"]
公式DockerHubのイメージを使用する場合
最初の使用
直接イメージを持ってくる場合
docker pull <イメージ名:タグ名>
docker compose up -d
イメージのアップデート
图像不会自动更新。需要明确输入以下命令。可以在不停止容器的情况下运行。
docker pull <イメージ名:タグ名>