Docker介绍以及它的常用命令

Docker介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,但是容器和本机之间可以存在接口并进行通信,比如使用tcp/udp协议进行容器和本机之间的通信。

本文通过在各种环境下安装开源软件Docker,然后学习使用常用的Docker命令,掌握开源Docker的基本工作原理,最后使用Docker搭建一个flask web,完成本机和容器之间的端口映射。

本文内容

1、下载安装Docker软件;

2、分别在两种操作系统(Win10, Linux)安装Docker;

3、学习Docker的基本命令;

下载安装Docker软件

关于在Linux下或Win10下安装Docker的步骤,网上已经有很多教程了,在这里就不再赘述。有意思的一点是,我在Win10下安装Docker并启动后,一直报错“Error response from daemon”,后来发现是因为我的电脑打开了VPN,把VPN关掉就可以正常启动了(这个类似的错误在pip安装pytorch时也有碰到过)。

在虚拟机的Ubuntu18.04中安装docker:

在本机的Windows10下安装docker:

因为在Windows10系统下Docker的虚拟化技术使用的是win10自带的Hyper-V,这和virtualbox的虚拟化技术会产生冲突,导致二者同时只能用一个,即使用Win10的Docker时不能使用VirtualBox虚拟机,使用VirtualBox虚拟机时不能使用Win10下的Docker。因为基本的命令都是一样的,所以接下来仅在Linux环境下学习Docker的基本命令。

Docker Hello World

    Docker 允许在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。在终端中输入以下命令:docker run ubuntu:16.04 /bin/echo "Hello world"。

参数解析:

  • docker: Docker 的二进制执行文件。
  • run: 与前面的 docker命令组合来运行一个容器。
  • ubuntu:16.04 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。可以看到,第一次运行这个命令时不存在这个镜像,所以需要下载后才能执行接下来的命令;第二次运行这个命令时已经存在这个镜像了,所以不需要经过下载,直接执行了后面的命令。
  • /bin/echo "Hello world": 在启动的容器里执行的命令。

以上命令的完整意思:Docker以ubuntu16.04镜像创建一个新容器,然后在容器里执行bin/echo “Hello world”命令,然后输出结果。

运行交互式的容器

    我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力。在终端中输入以下命令:docker run -i -t ubuntu:16.04 /bin/bash。

参数解析:

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

在第二行可以看到root@87c0606fdf4a:/# ,这意味着我们已经进入另一个ubuntu16.04系统的容器中。然后我们尝试在这个容器中执行cat /proc/version查看当前linux的版本信息,用ls查看当前目录下的文件列表,最后通过exit命令退出容器。

启动容器(后台模式)

使用docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"命令创建一个以后台进程方式运行的容器:

对于参数-d的解释如下:

-d, --detach      Run container in background and print container ID

即在后台运行一个容器,然后输出这个容器的ID,从上面图片也可以看到命令输出了e776fbb8c6a4cb3dcc0203836b6659ee1d13248df6aa22b2389ac521c4c23e8e这个长字符串,这个长字符串是容器的ID,这对于每个容器都是唯一的,我们可以通过容器的ID查看容器内发生了什么。

我们首先使用docker ps查看哪些容器在运行:

输出字段介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称,和CONTAINER ID一样,这个值是唯一的,可以唯一标识一个Docker。

我们可以在宿主主机中使用docker logs container_id或docker logs names查看某个容器内的标准输出:

    有意思的一点是,在我进行实验时,我发现使用docker ps输出的容器ID和使用docker run -d创建容器时输出的容器ID并不相同。docker ps输出的ID仅仅是创建容器时输出ID的前几位,这也就意味着当容器ID前几位就可以唯一确定这个容器时,我们不需要输入完整的容器ID就可以通过docker logs查看这个容器的信息,这和github的版本ID用法有点相似。

    最后,我们使用docker stop container_id或docker stop names停止容器运行。

Docker容器常用命令

  1. docker:查看Docker客户端所有命令选项。
  2. docker command - -help:更深入地查看指定的Docker命令command的使用方法。
  3. docker pull imagename:获取镜像。如果本地没有ubuntu镜像,我们可以使用docker pul ubuntu命令载入ubuntu镜像。
  4. docker run -it ubuntu /bin/bash:使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器。-i表示交互式操作;-t表示在新容器内指定一个伪终端或终端;ubuntu是指使用ubuntu镜像;/bin/bash放在镜像命后面,表示在容器中要执行的命令,这里我们希望打开一个交互式Shell,所以用的是/bin/bash命令。
  5. exit:退出命令行模式容器的终端。
  6. docker ps:不加-a参数时,只显示正在运行的docker的信息,加上-a参数则查看所有容器的信息(docker ps -a)。
  7. docker start container_id:启动一个已经停止的容器。
  8. docker stop container_id :停止ID为container_id的容器。
  9. docker restart container_id:重启ID为container_id的容器。
  10. docker run -itd --name ubuntu-test ubuntu /bin/bash:在后台打开一个新的容器,使我们可以用命令行模式操作容器,加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec或docker attach。
  11. docker attach:进入容器,使用容器终端与容器的ubuntu进行交互
  12. docker exec:进入容器,使用容器终端与容器的ubuntu进行交互(在这里,推荐使用 docker exec 命令,因为使用此命令进入容器后,退出容器终端时不会导致容器的停止。)
  13. docker export container_id > xxx.tar:将ID为container_id的容器快照导出到xxx.tar中,在硬盘上的存储这个容器对应的快照。
  14. docker import xxx.tar repository:tag:将容器快照文件再导入为镜像。(注意,这里是镜像,将容器使用export导出到快照,再使用import将快照导入为镜像,然后我们就可以通过此镜像创建新的容器。)
  15. docker rm -f container_id:删除ID为container_id的容器。
  16. docker container prune:删除所有处于终止状态的容器

Docker实例

    上面我们都是以安装Ubuntu实例的Docker容器举例,实际上Docker不仅仅能安装Ubuntu,它还支持安装如下实例:CentOS、Nginx、Node.js、PHP、MySQL、Tomcat、Python、Redis、redis集群、MongoDB、Apache等。

Docker实战——在docker中创建一个web应用

在docker容器中运行一个Python flask应用来运行一个web应用。

第一步:下载包括flask环境的ubuntu镜像。

第二步:为了查看这个镜像的具体信息,我们先创建一个可以交互的容器(因为这个容器实际上是配置好环境的Ubuntu镜像)。

第三步:进入容器,可以看到这个镜像安装的Pyhton是2.7.6,在/opt/webapp目录下有app.py文件,这就是flask web的主体,打开这个文件可以从代码中看到这个程序默认端口是5000。

第四步:退出这个容器,创建一个新的容器,同时设置本机和容器的端口映射。在这里我们使用参数-p将容器的5000端口映射到本机的127.0.0.1:5000上,当在本机中访问127.0.0.1:5000地址时,就转向访问容器5000端口提供的服务。

    第五步:打开本机浏览器,输入127.0.0.1:10000,即可访问容器5000端口提供的服务。

第六步:我们还可以在创建容器时使用参数-p将5000端口映射到本机0.0.0.0:10000上(不指定特殊IP时,会映射到0.0.0.0,代表映射到计算机中所有网卡的内网ip地址):

第七步:使用ifconfig命令查看计算机网卡的内网IP地址,我这里只有一张网卡:

第八步:使用10.0.2.15:10000访问网站:

第九步:除此之外,我们还可以使用-P参数将容器内部端口随机映射到主机的高端口。可以看到,它将容器的5000端口映射到本机0.0.0.0:32768上,其中32768这个端口号已经属于高端口了,很少会用到:

第十步:打开浏览器,输入http://10.0.2.15:32768/:

第十一步:停止正在运行地容器,然后使用docker ps -a查看处于所有状态的容器:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值