安装
操作
拉取镜像到本地
$ docker pull ubuntu:18.04
查看本地镜像列表
$ docker images
执行示例:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 775349758637 3 weeks ago 64.2MB
为镜像增加标签
可以通过镜像ID,或者 仓库名+标签 指定新仓库名和新标签。
$ docker tag 47b19964fb50 ubuntu:18.04-v2
$ docker tag ubuntu:18.04 ubuntu:18.04-v3
$ docker tag ubuntu:18.04 new-ubuntu:18.04
再次查看本地所有镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
new-ubuntu 18.04 47b19964fb50 3 days ago 88.1MB
ubuntu 18.04 47b19964fb50 3 days ago 88.1MB
ubuntu 18.04-v2 47b19964fb50 3 days ago 88.1MB
ubuntu 18.04-v3 47b19964fb50 3 days ago 88.1MB
可以看到,这几个镜像的 ID 是相同的。其实就是同一个镜像,但是 仓库名和标签不同。
用仓库+标签删除镜像
在上面的例子里,我们为 ubuntu 18.04 镜像创建了多个仓库名+标签 ,我们也可以删除 仓库名+标签 的形式删除镜像。如果一个镜像有多个仓库名+标签 ,需要全部删除后,才会真正将镜像删除。下面是一个例子,因为镜像没有被删除,所以命令执行结果是Untagged 。
$ docker image rm new-ubuntu:18.04
Untagged: new-ubuntu:18.04
用镜像ID删除镜像
使用 docker image rm <image id>
可以删除镜像。例如,ID 为 47b19964fb50 的镜像有两个仓库名+标签:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
new-ubuntu 18.04 47b19964fb50 3 days ago 88.1MB
ubuntu 18.04 47b19964fb50 3 days ago 88.1MB
尝试删除,但是删除失败:
$ docker image rm 47b19964fb50
Error response from daemon: conflict: unable to delete 47b19964fb50 (must be forced) - image is referenced in multiple repositories
因为有多个仓库名+标签
指向同一个镜像,所以要用 -f 参数强制删除:
$ docker image rm -f 47b19964fb50
执行后,docker images
执行结果中便没有47b19964fb50 这个镜像了。
也可以用下面的命令删除:
$ docker rmi -f 47b19964fb50
运行交互式容器
$ docker run -i -t ubuntu:18.04 /bin/bash
执行后,docker 基于镜像 ubuntu:18.04,并让容器运行,我们会进入了该容器的bash命令行中,可以执行一系列的 Linux 命令:
$ docker run -i -t ubuntu:18.04 /bin/bash
root@5511d00814e8:/# echo $HOSTNAME
5511d00814e8
root@5511d00814e8:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
以后台模式运行交互式容器
加上 -d
即可。
$ docker run -itd ubuntu:18.04 /bin/bash
查询有哪些运行中的容器
$ docker ps
或者下面的命令:
$ docker container ls
运行结果示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5511d00814e8 ubuntu:18.04 "/bin/bash" 2 minutes ago Up 2 minutes pensive_khayyam
启动容器时指定名称
$ docker run -i -t --name my-ubuntu ubuntu:18.04 /bin/bash
启动后,新打开一个终端查询有哪些运行中容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa2387a66708 ubuntu:18.04 "/bin/bash" 10 seconds ago Up 8 seconds my-ubuntu
可以看到容器的名字是 my-ubuntu
。
查询所有容器
docker ps -a
或者下面的命令:
$ docker container ls -a
执行示例:
▶ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5511d00814e8 ubuntu:18.04 "/bin/bash" 2 minutes ago Up 2 minutes pensive_khayyam
790d4e60e4b3 mysql:5.7 "docker-entrypoint.s…" 2 months ago Created
关闭/启动/重启容器
我们通过下面的指令可以启动一个容器:
$ docker run -i -t ubuntu:18.04 /bin/bash
进入容器的 bash 后,执行 exit ,容器便会结束执行。当然,这仅限于执行bash命令的容器。更通用的关闭容器的做法是:
$ docker stop 75195dc223e9
启动容器:
$ docker start 75195dc223e9
重启容器:
$ docker restart 75195dc223e9
75195dc223e9 容器执行的命令是/bin/bash。但是重启后,不会重新进入 bash 交互界面。我们可以用 attach 命令连接到启动的容器中:
$ docker attach 75195dc223e9
删除容器
$ docker container rm <container id>
或者
$ docker containerrm <container name>
使用 attach 与容器执行命令的标准输入输出交互
$ docker attach <container-id>
示例:
# 以后台模式启动一个容器
$ docker run -ith ubuntu:18.04 /bin/bash
5511d00814e8
# attach 正在运行的 /bin/bash 命令
$ docker attach 5511d00814e8
上面的地方,有一个点是,attach 到的是正在运行的那个 /bin/bash
进程。
如果我们在两个终端都attach 到该容器,会发现在终端1的输入数据,会在终端2同步显示。
使用 exec 进入容器命令行
exec 会打开一个新的进程。
$ docker exec -it <container-id> /bin/bash
示例:
# 启动一个容器
$ docker start 790d4e60e4b3
# 进入 bash
$ docker exec -it <container-id> /bin/bash
查看命令帮助
命令后增加 --help
即可。
示例1:
$ docker --help
示例2:
$ docker attach --help
搜索镜像
$ docker search <text>
示例:
$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 8870 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3115 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 657 [OK]
搜索镜像的 tag
去官网查询 https://hub.docker.com/ 。
docker-compose
文档: https://docs.docker.com/compose/ 。
实战1:使用 docker-compose 搭建 mysql 5.6 服务
创建目录mysql-5.6,在目录下创建文件 docker-compose.yml ,内容如下:
version: '2'
services:
mysql:
image: mysql:5.6.46
container_name: mysql-5.6.46
environment:
- MYSQL_ROOT_PASSWORD=123456
ports:
- "127.0.0.1:3306:3306"
- "127.0.0.1:33060:33060"
以下命令在 mysql-5.6 目录中执行。
启动:
$ docker-compose up
启动后,可以通过宿主机的 127.0.0.1:3306
端口访问 MySQL 服务。
以后台模式启动:
$ docker-compose up -d
停止:
$ docker-compose stop