什么是docker


docker是一个容器引擎,提供了一整套完整的容器解决方案。它是在2014年最火热的开源项目,基于Apache2.0开原协议,由Go语言开发。

什么是容器

容器其实历史比较久远,Linux上的LXC、Solaris上的Zones等都是容器的不同实现方式。

容器实质上是一个运行在宿主机上的进程。只不过在这个进程启动之前进行了一些处理,让进程进入了一个全新的虚拟环境,与宿主机的环境分离。所以这个进程认为自身处于一个独立的运行世界中。

一个简单的例子是:在容器中创建的文件在宿主机上是看不到的。

容器的优势

  • 容器创建、删除速度快
  • 容器在运行期间占用的开销比较小,在一个宿主机上,容器运行的数量可以很多

docker的优势

  • 容器管理很方便

安装docker-ce


在2017年docker将docker版本分为了 CE 和 EE 版本,EE 就是企业版本,CE 就是社区版本。

前提条件

docker已经可以运行在多种操作系统上甚至windows上,这里我采用centos7.3来安装。docker对操作系统要求如下:
- 内核版本大于3.10:可通过uname -r查看
- 系统是64位:可通过uname -i查看

yum安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

添加docker官方源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

更新yum索引

yum makecache fast

安装docker-ce

在配置好yum源后可直接使用yum命令进行安装:

yum install -y docker-ce

启动docker

安装好后启动docker:

systemctl docker start

然后可以运行下面的命令检查docker的版本:

docker version

这里写图片描述

其中几个比较重要的点:Server Version为当前版本,Storage Driver为存储驱动,Docker Root Dir为docker工作目录,Registry为默认下载镜像的地址

卸载docker

yum remove docker-ce
rm -rf /var/lib/docker

docker启动和停止

docker和其他服务一样,可以通过service命令来控制启动和停止:

'''启动'''
systemctl docker start

'''停止'''
systemctl docker stop

'''查看状态'''
systemctl docker status

'''重启'''
systemctl docker restart

docker架构


docker是一个典型的C/S架构:

docker server

这是一个守护进程,一直运行在后台,其中内嵌有一个web server

docker client

他是一个命令行工具,通过http协议与docker server进行交互

docker server和docker cliebt公用一个可执行文件,通过命令which docker就可以找到。

docker镜像


什么是docker镜像

简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。

docker可以理解为一个目录:docker server在启动容器的时候,先根据这个镜像目录复制出一个目录,然后在容器进程启动的时候,让这个进程chroot到这个目录下,这样这个目录就成了这个容器的根文件系统。

查看docker镜像

通过下面的命令可以查看本地有哪些docker镜像

docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/httpd             latest              2e202f453940        6 weeks ago         179 MB
docker.io/centos            latest              ff426288ea90        2 months ago        207 MB
docker.io/hello-world       latest              f2a91732366c        3 months ago        1.85 kB
docker.io/training/webapp   latest              6fae60ef3446        2 years ago         349 MB
  • IMAGE ID:镜像ID,长度为64位,通常用前12位表示就可以了
  • TAG:每个镜像可以打上多个TAG
  • REPOSITORY:本地镜像存储的仓库(刚装完的docker是空的)

REPOSITORY和TAG可以唯一标识一个镜像

镜像从哪里来

Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
https://hub.docker.com/explore

默认是国外的源,下载会慢,建议配置国内镜像仓库:

# vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}

修改完成后需要重启docker

docker容器


运行容器

运行容器可以使用docker run命令,常用选项包括:

-i -t:这两个选项经常一起用,缩写为 -it, 用于创建交互式容器
-d:让容器运行在后台,用于创建守护式容器
--name:为容器指定名称

运行交互式容器

现在我的本地镜像如下:

# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/httpd             latest              2e202f453940        6 weeks ago         179 MB
docker.io/centos            latest              ff426288ea90        2 months ago        207 MB
docker.io/hello-world       latest              f2a91732366c        3 months ago        1.85 kB
docker.io/training/webapp   latest              6fae60ef3446        2 years ago         349 MB

现在我通过docker.io/centos这个镜像创建一个交互式容器,命令如下:

docker run -it centos:latest /bin/bash

-it:指定创建交互式容器
centos:latest:以仓库:TAG的方式指定镜像名称
/bin/bash:容器对应的进程,会启动一个新的shell

通过上边的命令,启动了一个新的shell,这个shell是运行在容器环境中的。此时,我们离开了原本的shell,此后我们执行的shell命令都会在虚拟环境中。当我们执行exit就结束了了这个虚拟shell,从而结束了整个容器。

[root@193cbc5e0dbe /]# ls

anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

可以看到,在执行了docker run之后产生了一个新的shell,此时的命令提示符前的目录变成了193cbc5e0dbe。当运行这个命令时镜像不存在,则docker会自动从官方镜像仓库拉取镜像并生成容器。

运行守护式容器

交互式容器适合一些临时的任务。大多数情况下,希望创建守护式容器,即长期运行提供服务。方法如下:

docker run -d redis

这里创建一个redis的容器,但是我本地没有redis镜像,所以会从官方拉取镜像并创建容器。

这里,只提供了镜像名称而没有提供TAG,则会使用默认TAG “latest”,同样的没有指定命令,则会使用镜像提供的默认命令。redis镜像的默认命令是:/entrypoint.sh redis-server

守护式容器运行在后台,而shell还是宿主机的shell,这样就可以进行其他工作而不受容器的影响。

恢复守护式容器

守护式容器运行在后台,需要恢复守护式容器到前台可以使用下面的命令:

docker attach a44303d15bfa

a44303d15bfa是容器的id,也可以是容器的NAME。

查看容器的基本信息

通过下面的命令可以查看容器的基本信息:

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f9cb9fe5a189        redis               "docker-entrypoint..."   4 minutes ago       Up 4 minutes        6379/tcp            brave_mccarthy

可以看到容器的ID、使用的镜像、状态等信息

这里看不到之前交互式容器的信息,因为退出了,ps在不带有参数的时候只显示正在运行的容器。但是可以添加-a选项查看到:

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
f9cb9fe5a189        redis               "docker-entrypoint..."   4 minutes ago       Up 4 minutes               6379/tcp            brave_mccarthy
193cbc5e0dbe        centos:latest       "/bin/bash"              17 minutes ago      Exited (0) 8 minutes ago                       clever_roentgen

可以看到交互式容器的状态为退出。

查看容器详细信息

docker ps命令只能查看到一些基本的内容,想要知道更详细的信息比如:ip、端口等,就需要如下命令:

docker inspect f9cb9fe5a189

其中f9cb9fe5a189是容器的ID。这个命令返回一个json格式的数据,十分详细。有时二次开发需要这个信息。

如果说只想要获取IP地址的话,可以添加如下参数:

docker inspect -f '{{.NetworkSettings.IPAddress}}' f9cb9fe5a189

{{.NetworkSettings.IPAddress}}可以理解为NetworkSettings下的IPAddress字段

停止守护式容器

停止守护式容器可以使用下面的命令:

docker stop f9cb

f9cb是容器ID的缩写,这样也是可以的,此时使用docker ps就看不到这个容器了。

也可以使用:

docker kill f9cb

stop和kill的区别是:stop是发送信号到容器,等待容器停止,而kill是直接杀死容器进程。

删除容器

停止容器并不会删除容器,删除容器可以使用如下的方式:

docker rm f9cb9

f9cb9是容器ID的缩写,这样在docker ps -a中就看不到这个容器了,它被删除了。

创建容器时指定名称

创建容器时会默认分配一个比CONTAINER ID更友好的名字,这个字段叫NAMES,可以通过下面的命令来控制容器的名字:

docker run --name test_hello -it centos echo "123"

此时,通过docker ps -a查看,这个容器的名字是我们自己定义的:
这里写图片描述

重新启动已经停止的容器

可以通过start参数让已经停止的容器恢复运行:

docker start  -i test_hello

这样就不用为运行一个命令每次创建一个新的容器。这里也可以指定容器的id

容器日志

docker logs [-f][-t][--tail]
-f:是否跟踪日志变化,默认为false
-t:是否加上时间戳,默认为false
--tail:返回后几行日志,默认为all

如果不指定选项,则返回所有的日志。

这里写图片描述

首先创建一个守护式容器,然后不指定参数查看log,则返回所有的日志。

这里写图片描述

加上-t选项,日志加上了时间

这里写图片描述

加上-f选项,可以看到日志的动态更新。

这里写图片描述

加上–tail选项,指定显示最新的N条

查看容器内的进程

docekr top b77a4ee19c4b

指定容器id或name

这里写图片描述

在运行的容器中启动新的进程

docker exec [-d][-i][-t] 容器名 命令 参数
docker exec -it b77a4ee19c4b /bin/bash

这里写图片描述

可以看到进入了新的bash进程,按CTRL+P CTRL+Q让当前容器转入后台运行,然后查看进程:
这里写图片描述

可以看到在容器中启动了一个新的进程。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐