运行交互式的容器

$ docker run -it ubuntu /bin/bash

各个参数解析:

  • -t: 在新容器内指定一个伪终端或终端。

  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

需要确认容器有在运行,可以通过 docker ps 来查看:

image-20210719200501348

在容器内使用 docker logs 命令,查看容器内的标准输出:

image-20210719200534290

下面的命令来停止:

$ docker stop <容器id>

#停止的容器可以通过 docker restart 重启:
$ docker restart <容器 ID>

后台运行

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。

$ docker run -itd --name ubuntu-test ubuntu /bin/bash

exec 命令

下面演示了使用 docker exec 命令。

docker exec -it 243c32535da7 /bin/bash

注意: 如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。

更多参数说明请使用 docker exec –help 命令查看。

但是docker run,从这个容器中退出,会导致容器的停止

导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

$ docker export 1e560fca3906 > ubuntu.tar

导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1

删除容器

删除容器使用 docker rm 命令:

$ docker rm -f 1e560fca3906

我们也可以通过 -p 参数来设置不一样的端口:

runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py

网络端口的快捷方式

通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。

上面我们创建的 web 应用容器 ID 为 bf08b7f2cd89 名字为 wizardly_chandrasekhar

我可以使用 docker port bf08b7f2cd89docker port wizardly_chandrasekhar 来查看容器端口的映射情况。

查看WEB应用程序容器的进程

我们还可以使用 docker top 来查看容器内部运行的进程

image-20210719201304089

列出镜像列表(常用)

使用 docker images 来列出本地主机上的镜像。

image-20210719201340746

获取一个新的镜像

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

image-20210719201408662

删除镜像

镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1、从已经创建的容器中更新镜像,并且提交这个镜像

  • 2、使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

image-20210719201514740

在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit 命令来退出这个容器。

此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

image-20210719201539839

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

image-20210719201608264

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

image-20210719201643184

设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

image-20210719201708005

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

网络端口映射

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。

image-20210719201749688

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

image-20210719201831646

上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

image-20210719201855193

查看容器ip地址

docker inspect <容器名>

查看容器网络

使用docker-compose up启动容器后,这些容器都会被加入app_default网络中。使用docker network ls可以查看网络列表,docker network inspect 可以查看对应网络的配置。

容器网络的基本

创建一个docker容器,docker系统会自动为该容器分配一个ip地址,通常是172.17开头。

我们可以在主机上用 docker inspect 命令 或者进入容器用ifconfig命令来查看容器的ip地址。

假设某个容器(假设容器的名称为myweb)被分配的地址是 172.17.0.2,该容器上启动了一个web服务,其端口号是80(注意这是容器中的端口号)。

这时我们用docker port命令可以查看该web服务在容器的端口对应到主机端口的信息,如:

docker port myweb

输出

80/tcp -> 0.0.0.0:32776

总结下,如果某个容器提供了对外的服务(如web服务),则统一的访问方式可以利用docker主机的ip地址和容器映射到主机上的端口来统一访问。

dockerfile示例:

    1 FROM centos:centos6
    2 MAINTAINER David "xx@xx.com"
    3 RUN yum install -y mysql-server mysql
    4 RUN /etc/init.d/mysqld start
    5 RUN mysql -e "grant all privileges on *.* to 'root'@'%' identified by '1234';"
    6 RUN mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '1234';"
    7 EXPOSE 3306
    8 CMD ["/usr/bin/mysqld"]

树莓派中使用的java镜像

docker pull armhfbuild/java

将容器保存为镜像

docker commit [选项] [容器ID或容器名] [仓库名:标签]

例子:

# docker commit -a ‘weikaixxxxxx’ -m ‘导入了数据库’ 9adeb5943045 mysql:v2

docker commit e400eca4994d centos1

进入容器

docker exec -it 243c32535da7 /bin/bash

Docker容器向宿主机传送文件

格式:

docker cp container_id:<docker容器内的路径> <本地保存文件的路径>

比如:

docker cp 10704c9eb7bb:/root/test.text /home/vagrant/test.txt

宿主机向Docker容器传送文件

格式:

docker cp 本地文件的路径 container_id:<docker容器内的路径>

比如:

docker cp /home/vagrant/test.txt 10704c9eb7bb:/root/test.text

使用Dockerfile文件构建镜像:

docker build -t xxxx:xxxx  .