【Docker】基本的なdockerコマンド
はじめに
Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。
启动容器的流程
-
- 从Docker Hub拉取镜像并启动容器。
通过Dockerfile构建镜像,然后从该镜像启动容器。
更新Docker镜像的步骤
-
- 更新Dockerfile并构建新镜像
- 更新容器并基于此创建镜像
拉取docker镜像
可以在主机上从Docker Hub拉取Docker镜像。
通过使用:的形式来指定tag,可以指定要拉取的版本。如果未指定,则会拉取最新版本latest。
$ docker pull <image>:<tag>
$ docker pull hello-world
>
Using default tag: latest
latest: Pulling from library/hello-world
Digest: sha256:faa03e786c97f07ef34423fccceeec2398ec8a5759259f94d99078f264e9d7af
Status: Image is up to date for hello-world:latest
docker.io/library/hello-world:latest
Docker镜像
ホスト上にあるdocker imageのリストを確認する事ができる。
仓库表示从Docker Hub的哪个仓库获取。标签表示Docker镜像的版本。
$ docker images
>
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 46331d942d63 8 months ago 9.14kB
使用Docker进行构建<构建内容>。
使用Dockerfile创建Docker镜像。
$ docker build
运行 Docker
根据指定的镜像启动容器。
如果图像在主机上不存在,则会自动从Docker Hub拉取并执行。
容器并不必须持续运行,还可以在启动后立即执行测试程序并自动结束等其他用途。
$ docker run <image>
$ docker run 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/
$ docker ps
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# コンテナが起動され、コンテナ内にあるプログラムが動いた後にコンテナが終了している状態。
使用Docker运行<镜像> <命令>。
可以指定在容器启动后执行的命令。
例如,如果向
如果没有参数,将执行默认指定的程序。
$ docker run -it ubuntu bash
>
root@cacb83882717:/#
# -itはbash起動時に必要なオプション
# root@cacb83882717は「rootユーザー」と「コンテナID」を示している
root@cacb83882717:/ ls
>
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
# コンテナ内のディレクトリ一覧が表示されている(ホスト側ではない)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cacb83882717 ubuntu "bash" 16 minutes ago Exited (0) 34 seconds ago vigilant_lalande
ecad7969760a hello-world "/hello" 39 minutes ago Exited (0) 39 minutes ago flamboyant_franklin
# COMMANDに記載しれているコマンドがコンテナ起動後に実行されるコマンドである
列出正在运行的 Docker 容器。
显示主机中存在的容器以及容器的状态的列表。”ps” 是 “process status” 的缩写。
只显示活动(正在运行)的容器,仅使用docker ps命令。
要显示所有容器(包括停止状态的容器等),需要加上-a选项。
$ docker ps
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecad7969760a hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago flamboyant_franklin
重启 <容器> 的 Docker。
可以使用”restart”命令重新启动退出状态的容器。
$ docker run -it ubuntu bash
root@cacb83882717:/ ls
>
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@cacb83882717:/ exit
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cacb83882717 ubuntu "bash" 16 minutes ago Exited (0) 34 seconds ago vigilant_lalande
$ docker restart cacb83882717
>
cacb83882717
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cacb83882717 ubuntu "bash" 29 minutes ago Up 35 seconds vigilant_lalande
使用 Docker 执行指令 。
可以对指定正在运行的容器执行命令。
执行命令对于处于exited状态的容器会产生错误,请注意。
exec是execute(执行)的缩写。
使用docker run命令可以从镜像创建和启动一个容器,然后在容器内执行指定的命令。
$ docker exec -it cacb83882717 bash
>
root@cacb83882717:/
使用exit或detach命令离开容器。
当退出容器时,exit命令将终止正在运行的进程并离开容器。容器的状态将变为exited。
当使用”detach”命令离开容器时,会保留进程并离开容器。容器将保持处于up状态。
# コンテナから出て、コンテナexited状態になる
root@cacb83882717:/ exit
# コンテナから出るが、コンテナはup状態のままである
root@cacb83882717:/ ctrl+p+q
使用docker attach <容器名称>命令返回原来的进程。
当从容器中分离(detach)出来时,通过附加(attach)回到容器中可以回到原来的进程。
$ docker attach <container>
将<容器>更改为<新容器>:<标签> 可以用下列的方式来实现docker commit
将编辑过的容器保存为镜像。
一般而言,常见的流程是在启动容器后安装软件包等,构建应用程序的执行环境。
環境が構築出来たら、docker imageに変換(commit)してdocker hubにpushすることで、他の開発メンバーに共有する事ができる。
$ docker commit cacb83882717 ubuntu:updated
>
sha256:1924025ed965355d25e1709e01259bbc4f2bb4fdaa4d3f8de034d0dfcb808ae3
$ docker images
>
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu updated 1924025ed965 2 minutes ago 69.2MB
ubuntu latest 3c2df5585507 5 weeks ago 69.2MB
关于Docker Hub的仓库名称
在推送到 Docker Hub 时,镜像名称必须与 Docker Hub 上的仓库名称相匹配,并且镜像名称与仓库名称必须一致。
将 <源> 打标签为 <目标> 。
修改图像名称。
为了将镜像推送到Docker Hub,需要将仓库名称与镜像名称匹配,因此需要更改主机上的镜像名称。
$ docker tag <image>:<tag> <username>/<repository>
$ docker tag ubuntu:updated xxx/my-first-repo
$ docker images
>
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu updated 1924025ed965 10 hours ago 69.2MB
xxx/my-first-repo latest 1924025ed965 10 hours ago 69.2MB
# 新しく作ったrepository名のImageIDと元のrepository名のImageIDは同じである点に注意
使用docker推送镜像。
将指定的镜像推送到Docker Hub。
ホスト上のimageをdocker hubにpushした際、docker hubに元々存在しているImage Layer部分に関してはpushされずにdocker hubのImage Layerを参照することになる。
$ docker push xxx/my-first-repo
>
Using default tag: latest
The push refers to repository [docker.io/xxx/my-first-repo]
4d9425067bcf: Pushed
12dae9600498: Mounted from library/ubuntu
latest: digest: sha256:5c7c539a3733d311de4fdd86654410f16acd13ea07b51afed43a4d68efc80feb size: 736
# 「4d9425067bcf」のImage Layerのみがpushされている(ubuntuのimage自体は元々docker hubにあるため)
删除Docker镜像 。
删除指定的图像。
$ docker rmi xxx/my-first-repo
>
Untagged: xxx/my-first-repo:latest
Untagged: xxx/my-first-repo@sha256:5c7c539a3733d311de4fdd86654410f16acd13ea07b51afed43a4d68efc80feb
$ docker images
>
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu updated 1924025ed965 11 hours ago 69.2MB
docker run = (docker拉取 + ) docker创建 + docker启动
在使用docker create命令从镜像创建容器后,使用docker start命令启动容器。
$ docker run 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/
创建一个 Docker 镜像。
指定したimageを基にコンテナを作るが、実行はされない。状態はcreatedとなる。
$ docker create hello-world
>
36bfd5179428f117aa984cf2849ae09ebbbbb20569a3ece4b7d605c4449b1017
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
36bfd5179428 hello-world "/hello" 22 seconds ago Created dreamy_colden
启动Docker容器 。
启动指定的容器。
运行命令时容器会启动并执行默认设置的程序,直到容器结束。
仅用中文进行一个翻译选项:
然而,无法确认程序的执行结果(只有在使用-a选项运行容器时才能确认)。
$ docker start 36bfd5179428
>
36bfd5179428
$ docker start 36bfd5179428 -a
>
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/
在这个命令中,”docker run -it ubuntu bash”中的”-it”是什么意思?
-itは-iと-tという2つのオプションが重なって表現されている。それぞれ別々に記載してもOK。
-iはホストからコンテナへの入力チャネルを開くオプション(STDINをホストからコンテナに繋げる役割)。
LinuxにはSTDIN(キーボードからの入力)とSTDOUT、STDERR(ディスプレイへの表示)という3つのチャネルが存在して、ホスト側とやりとりしている。
-tは出力結果を綺麗に表示する。
$ docker run -i -t ubuntu bash
# 上記の表現でもOK
$ docker run -t ubuntu bash
>
root@7f3af913d488:/ ls
# lsを実行しても入力チャネルが開いていないためコンテナに認識されず、何も返却されない
% docker run -i ubuntu bash
>
ls
bin
boot
dev
etc
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 綺麗に表示されない
移除 <容器> 的 docker
可以删除处于exited状态的容器。
必须先停止容器,才能删除,无法删除正在运行的容器。
# 停止中のコンテナを削除
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
257be8df754a ubuntu "bash" 46 seconds ago Up 45 seconds ecstatic_lovelace
03b3bd8f25eb hello-world "/hello" About a minute ago Exited (0) About a minute ago compassionate_curie
$ docker rm 03b3bd8f25eb
>
03b3bd8f25eb
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
257be8df754a ubuntu "bash" About a minute ago Up About a minute ecstatic_lovelace
# スペースを空けてコンテナ名を繋げることで複数のコンテナを同時に削除できる
$ docker rm <container> <container> <container>
# 起動中のコンテナを削除(エラーになる)
$ docker rm 257be8df754a
>
Error response from daemon:
You cannot remove a running container 257be8df754aa7b5cd32620403303c867a25ec3db725daeb6e591bee1c3e63ea.
Stop the container before attempting removal or force remove
停止 Docker 容器。
停止运行中的容器。
# 起動中のコンテナを停止する
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
257be8df754a ubuntu "bash" About a minute ago Up About a minute ecstatic_lovelace
$ docker stop 257be8df754a
>
257be8df754a
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
257be8df754a ubuntu "bash" 8 minutes ago Exited (137) 3 seconds ago ecstatic_lovelace
# スペースを空けてコンテナ名を繋げることで複数のコンテナを同時に停止できる
$ docker stop <container> <container> <container>
清理Docker系统
删除所有正在运行的容器。请注意,卷等也将被删除。
# 起動中のコンテナを停止する
$ docker system prune
>
WARNING! This will remove:
# 下記の情報が削除される
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
257be8df754aa7b5cd32620403303c867a25ec3db725daeb6e591bee1c3e63ea
d343fe39ac7d55f9c88eb1acbb1d132636340901522a73eebbea9135d0de266f
Deleted Networks:
wordpress_default
Deleted Images:
deleted: sha256:0caff4dd47d5a4aa7633502a75bb2b35f19cc04f6288de0e85bb7cd06898dd1c
deleted: sha256:f42214ebdfe5e2472fc3f9144b1a0b5dece4cead6d453e09bdb446a73681e8fe
Deleted build cache objects:
t9b1vqxdq0ap4quncgdeelmeg
ozp3h3o7v51hytty7k9pquz7q
Total reclaimed space: 446.4MB
使用 Docker 运行镜像,并指定容器的名称为 ,镜像为 。
コンテナに名前をつけることができる(同じ名前のコンテナを作ることはできないため注意)。
起動させ続けるコンテナを立てるときや、共有サーバを使うときなどには名前を付けると良い。
プログラムからコンテナを呼び出すときにコンテナ名が定義されていると扱いやすい(名前がない場合はコンテナのID(ランダム値)を使うことになる)。
$ docker run --name sample_container ubuntu
$ docker ps -a
>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
713db736683d ubuntu "bash" 8 seconds ago Exited (0) 7 seconds ago sample_container
分离模式和前台模式
在启动容器后立即将其分离并返回到主机的操作,即在后台运行容器。
-dオプションをつけるとdetached modeになる。
-dオプションを付けない場合はforeground modeとして起動される。
# バックグラウンドでコンテナを動かす場合
$ docker run -d <image>
使用docker运行镜像,并删除容器。
在启动容器时加上” –rm”选项,这样在退出后会自动删除该容器(使其成为一次性容器)。
$ docker run --rm <image>