1、安装Docker

2、容器

2.1 创建容器

1
2
3
4
# 完整
docker container run <image name>
# 简写
docker run <image name>

image 即镜像名称,以创建Nginx的容器为例

1
docker run nginx

注:如果本地没有Nginx的镜像,会自动从镜像仓库拉取

常用选项

  • --name <name>为新创建的容器指定名字(NAME);

    默认为docker随机生成的字符串,以创建名为 mynginx的Nginx容器为例

    1
    docker run --name mynginx nginx
  • -p <port:port>为新创建的容器指定IP映射,默认为空,没法访问;

    以主机的80端口映射到Nginx容器的80端口为例

    1
    docker run --name mynginx -p 80:80 nginx
  • -P大写的P表示随机映射端口

    1
    docker run -P nginx
  • -d 隔离模式,容器启动后不会占用终端的输入输出。

    1
    docker run -d nginx
  • -it交互模式,容器启动后可以使用终端进行交互(见2.7 交互模式)

2.2 查看容器

使用查看容器命令会列出容器的CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

查看运行中的容器

1
2
3
4
# 完整
docker container ls
# 简写
docker ps

列出所有的容器

1
2
3
4
# 完整
docker container ls -a
# 简写
docker ps -a

只列出容器ID

1
2
3
4
5
6
7
# 简写
# 列出运行中的容器的ID
docker ps -q
# 列出所有容器的ID
docker ps -aq
# 选项不分先后,等同于如下
docker ps -qa

2.3 停止容器

停止某个正在运行的容器

1
2
3
4
# 完整
docker container stop <ID or NAME>
# 简写
docker stop <ID or NAME>

以停止mynginx容器为例

1
2
3
4
5
6
7
# 使用ID 不用写完整,写前一部分即可
docker stop 639ca221114e
# 成功结束会返回 639ca221114e

# 使用NAME
docker stop mynginx
# 成功结束会返回 mynginx

停止所有的容器

可以在stop后跟上所有需要停止的容器的ID,如下

1
2
# 笨方法
docker stop 639ca221114e, f2fec87f549d

这显然不适用于容器过多的情况,可以使用上文提到的docker ps -qa先列出所有容器的ID,作为docker stop <ID, ID>的输入,可以使用$()进行命令的组合,如下

1
2
3
4
# 简写 停止所有的容器
docker stop $(docker ps -qa)
# 停止运行中的容器
dokcer stop $(docker ps -q)

2.4 启动容器

让停止的容器重新运行可以使用startrestart命令

1
2
3
4
5
6
7
8
9
# 启动容器 start
# 完整
docker container start <ID or NAME> # 可以一次启动多个容器,使用逗号(,)分隔多个容器的ID或NAME
# 简写
docker start <ID or NAME>

# 重启容器 restart
# 简写
docker restart <ID or NAME>

以运行和重启mynginx为例

1
2
3
4
5
6
7
8
# 运行 mynginx
# 使用ID
docker start 585addcafde5
# 使用NAME
docker start mynginx

# 重启 mynginx
docker restart mynginx

-i选项即使没有附加也可以保持Stdin打开

1
docker start -i mynginx

-a选项使用attached模式启动

1
docker start -a mynginx

2.5 删除容器

1
2
3
4
# 完整
docker container rm <ID or NAME>
# 简写
docker rm <ID or NAME>

以删除mynginx为例

1
2
3
4
# 完整
docker container rm mynginx
# 简写
docker rm mynginx

删除所有容器

同停止所有容器一样,使用组合命令,如下

1
docker rm $(docker ps -qa)

强制删除正在运行的容器

删除正在运行的容器会报错,需要使用-f选项强制删除

1
docker rm 78de3f4gd65 -f

2.6 attached和detached模式

attached模式即容器在前台运行,日志信息会直接输出到终端;

detached模式即容器在后台运行,日志信息不会输出到终端,终端可继续执行其他命令。

detached模式

创建容器时使用-d--detach选项,以mynginx为例

1
docker run -d -p 80:80 --name mynginx nginx 

detached模式下查看日志

只查看一次

1
docker logs <ID or NAME>

动态跟踪日志使用-f

1
docker logs <ID or NAME> -f

detached模式转换为attached模式

1
docker attch <ID or NAME>

2.7 交互模式

如果镜像是一个操作系统(如Ubuntu),使用attached和detached模式是没法交互的,就需要使用交互模式创建了。

使用-it选项开始交互模式,以Ubuntu为例

1
docker run -it --name ubuntu15.1 ubuntu:15.10 sh

冒号:用于指定镜像版本;

sh 表示可以使用shell脚本。

容器创建后会自动运行,运行后就进入交互模式,可以使用ls等命令

交互模式

注:使用exit退出会同时结束容器。

为了不退出,创建容器时应当加上-d选项开启detached模式,使用exec命令运行容器。

1
docker exec -it <ID or NAME> sh

-it为交互模式,sh代表交互的方式,即用shell脚本交互

以创建并使用exec启动Ubuntu为例

1
2
3
4
# 创建容器(加上-d选项)
docker run --name ubuntu15 -d -it ubuntu:15.10 sh
# 使用exec对容器执行操作
docker exec -it ubuntu15 sh

注:创建容器时加上-it选项是因为操作系统镜像需要交互模式,如果是Nginx一类的镜像可以不加。

2.8 查看容器详细信息

1
2
3
4
# 完整
docker container inspect <ID or NAME>
#简写
docker inspect <ID or NAME>

3、镜像

3.1 拉取镜像

1
2
3
4
# 完整
docker image pull <image name>
# 简写
docker pull <image name>

先在[DokerHub](Docker Hub Container Image Library | App Containerization)上搜索相应的镜像,点击查看,右侧有拉取的方式,以node为例,右侧拉取方式如下

node拉取方式

拉取node

tag为版本号,latest为最新版,使用冒号(:)指定版本docker pull node:14.0

3.2 查看镜像

1
docker image ls

查看镜像的详细信息

1
docker image inspect <image ID>

3.3 删除镜像

1
docker image rm <image ID>

3.4 导出镜像

1
docker image save nginx:latest -o nginx.image

:latest指定导出的版本号,-o即输出的路径

3.5 导入镜像

1
docker image load -i ./nginx.image

3.6 通过Dockerfile构建镜像

后面更……

4、Docker网络模式

Docker有四种网络模式,Bridgehostnonecontainer

使用docker network ls查看网络列表

1
docker network ls

4.1 Bridge模式

Docker 守护进程创建了一个docker0网桥,默认情况下新建的容器都会桥接到这个网桥,桥接到docker0的网卡能够互相转发数据包。类似于VMware的NAT模式。

4.2 host模式

容器没有自己的网卡,共享宿主机的IP和端口,创建容器时使用--network host指定

1
docker run --name nginx --network host nginx

4.3 container 模式

共享其他容器的网络,使用如下方式创建

1
docker run --name nginx --network container:<ID or NAME> nginx

注:主容器退出了,依赖它的容器会没有网

4.4 none模式

容器只有lo接口,只能使用127.0.x.x (localhost)

4.5 创建网络

使用默认的bridge模式无法为容器指定IP,需要使用自定义的网络模式。使用如下命令创建

1
docker network create -d <bridge | host | container> --subnet 192.168.38.0/24 --gateway 192.168.38.1 mynet

-d (--drive)指定网络模式,不指定就是bridge

--subnet设置网络的网段

--gateway设置网关

mynet即网络名

使用docker network ls查看网络列表,mynet已经出现在列表中了

4.6 使用自定义的网络为容器分配固定IP

在创建容器时使用--ip <192.xxx.xx.xx>为容器分配固定的IP

1
docker run --name nginx --ip 192.168.38.100 nginx

同一个网络下的容器之间可以使用容器名通信。

4.7 将其他容器连接到自定义网络

1
docker network connect [option] network-name <ContainerID or NAME>

以将busybox(容器名为 bbox)添加到mynet并分配IP192.168.38.101为例

1
docker network connect --ip 192.168.38.101 mynet bbox

将容器连接到一个网络会分配一个该网段的IP给容器,以前的网络连接会保留,即容器连接到了多个网络。

使用disconnect断开连接

1
docker network disconnect mynet bbox