Categories: Docker

Docker 安装与配置

Docker入门与实践

安装并启动docker

直接通过脚本来安装

# wget -qO- https://get.docker.com/ | sh

安装完成后启动Docker

# systemctl start docker

# systemctl status docker

配置Docker服务

为了避免每次使用Docker命令都需要切换到特权账户,将当前用户加入安装中自动创建的docker用户组:

# sudo usermod -aG docker root

我们可以使用docker info命令来查看Docker的信息。

使用docker镜像

获取镜像

我们首先获取下镜像,这个是基础,获取镜像的时候要tag标签打全,否则会下载latest镜像,可能是不稳定版本。

# docker pull ubuntu:18.04

查看镜像信息

使用images命令列出镜像

# docker images

其中的image id,如果2个镜像的id相同说明指向了同一个镜像,只是tag标签不同而已。

使用tag命令来添加镜像标签

为了方便后续工作中使用镜像,我们可以为本地镜像添加任意标签

# docker tag ubuntu:18.04 myubuntu:18.04

可以看到ID都是相同的,实际是同一个镜像,只是别名不同而已。相当于做了个链接。

使用inspect命令查看详细信息

这个命令可以查看镜像的详细信息,包括作者,适应架构等

# docker inspect ubuntu:18.04

上面返回了一个JSON格式的消息,如果只要其中的一段,可以-f参数来指定

# docker inspect -f {{“.Architecture”}} ubuntu:18.04

使用history命令来查看镜像历史

镜像文件是由多个层组成的,我们可以使用history命令查看各层的创建信息。

# docker history ubuntu:18.04

搜寻镜像

docker的命令search可以搜索官方库里的镜像

搜索官方的nginx镜像

# docker search –filter=is-official=true nginx

搜索收藏数量超过4的tensorflow镜像

# docker search –filter=stars=4 tensorflow

删除和清理镜像

rm和prune命令

使用标签删除镜像

rmi或image rm命令删除镜像

-f强制删除镜像,即使有容器依赖

-no-prune 不清理未带标签的父镜像

删除ubuntu 18.04镜像

# docker rmi myubuntu:18.04

当同一个镜像有多个标签时,只删除了这个镜像标签的指定标签而已,不影响原来的镜像文件。

我们这里还能看到原来的镜像

如果镜像只有一个标签就要小心了,会彻底删除镜像。

下面就是删除只有一个标签的镜像,彻底删除这个镜像的所有层了

使用镜像ID来删除镜像

使用rmi删除镜像id(也可以是能区分的部分id串前缀),会先尝试删除所有指向该镜像的标签,然后删除镜像文件本身。

当用这个镜像创建了容器时,这个镜像时无法删除的。

可以用docker ps -a 查看本机存在的所有容器。

如果要强行删除镜像使用-f参数

docker rmi -f ubuntu:18.04

然后使用ID来删除镜像

# docker rmi 93fd78260bd1

清理镜像

使用docker一段时间后,系统中会有一些临时的镜像文件,以及一些没用被使用的镜像,可以通过docker image prune命令来清理。

下面的命令演示自动清理临时的遗留镜像文件层,最后会提示释放的存储空间

# docker image prune -f

创建镜像

创建镜像的方法主要有三种,基于已有的镜像的容器来创建,基于本地模板导入,基于dockerfile创建。

基于已有容器创建

首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出

# docker run -it ubuntu:18.04 /bin/bash

root@486c30677dc2:/# touch test

root@486c30677dc2:/# exit

记住容器id为486c30677dc2

这时镜像和原来的相比以机发生了改变,可以用命令来提交作为一个新的镜像。提交时可以使用ID或名称来指定容器

docker commit -m “Added a new file” -a “Docker New” 486c30677dc2 test:0.1

此时查看本地镜像列表,会发现新的镜像已经存在了

基于本地模板导入

可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。

我们从openvz提供的模板来创建,https://download.openvz.org/template/precreated/下载地址

我们随便下一个

# wget https://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz

然后导入

# cat ubuntu-16.04-x86_64.tar.gz | docker import – ubuntu:16.04

基于Dockerfile创建

这是最常见的方式,Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。以后会做这个实验

存出和载入镜像

save和load命令

存出镜像

可以加-o参数,导出镜像到指定的文件中

导出本地ubuntu:18.04镜像为文件ubuntu_18.04.tar

# docker save -o ubuntu-18.04.tar ubuntu:18.04

然后就可以把这个文件分享给别人

载入镜像

可以将导出的tar文件在导入到本地的镜像库,可以用-i参数,从指定文件中读入镜像内容。

# docker load -i ubuntu-18.04.tar

或者# docker load < ubuntu-18.04.tar

这将导入镜像及相关的元数据信息包括标签,导入成功后可以用docker images命令查看,与原镜像一致。

上传镜像

push命令,默认上传到Docker Hub官方仓库,需要登陆。要去官方注册下。

用户user上传本地的test:lastest镜像,可以先添加新的标签user/test:lastest,然后docker push命令上传

docker tag test:latest user/test:lastest

docker push user/test:lastest

第一次上传会提示输入用户名密码,以后就会记录到~/.docker目录下。

操作Docker容器

镜像介绍完了,下面开始容器了。作为一名VMware的虚拟化工程师我是这么理解镜像,容器,仓库概念的。容器就相当于我们的桌面虚拟化。仓库是存着你的桌面系统镜像,win7.win8,win10,容器就是Thinapp,像office,winrar,这些软件。镜像就是win7这些操作系统,我们提供用户桌面虚拟机的话,先提供一个操作系统,然后上面加上软件,提供给用户,容器我个人认为也是这样的概念。当然docker上的操作系统非常的小,比虚拟机小多了。

创建容器

新建容器

使用docker create命令新建一个容器。

# docker create -it ubuntu:18.04

# docker ps -a

新建容器之后,容器处于停止状态,使用docker start命令来启动

启动容器

下面我们来启动容器,下面的命令后面f7就是前面容器的id,然后用docker ps命令查看运行中的容器

# docker start f7

新建并启动容器

我们也可以新建并直接启动一个容器,docker run命令

下面输出一个Hello world之后容器自动停止

# docker run ubuntu:18.04 /bin/echo ‘hello world’

利用docker run来创建并启动容器时,后台会有下面的几个标准操作

  • 检查本地是否存在指定的镜像,不存在就从公有云仓库下载
  • 利用镜像创建一个容器,并启动容器
  • 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
  • 从宿主机配置的网桥中桥接一个虚拟接口到容器中
  • 从网桥地址池分配一个ip给容器
  • 执行用户指定的应用程序
  • 执行完毕容器自动停止

下面启动一个bash终端,可以让用户交互

# docker run -it ubuntu:18.04 /bin/bash

-it命令就是让用户来交互的,更多命令选项man docker-run查看。

交互模式下,用户可以自己输入命令

ps可以看到指运行了一个bash

可以输入exit来退出容器,退出容器后,容器就关闭了。

守护态运行

很多时候比如我们用nginx的容器,我们要他始终运行,就要用守护态形式,使用-d参数

# docker run -d ubuntu:18.04 /bin/sh -c “while true; do echo hello world; sleep 1; done”

然后用docker ps查看id

查看容器输出

docker logs命令查看容器输出的信息

-details 打印详细的信息,很多命令不写了

# docker logs 8e6a

停止容器

暂停容器

Docker pause命令

我们先启动一个容器,然后在暂停

# docker run -d ubuntu:18.04 /bin/sh -c “while true; do echo hello world; sleep 1; done”

# docker pause 7d1bb

终止容器

Docker stop命令

该命令会先向容器发送sigterm信号,等待一段时间后(默认10秒),在发送sigkill信号来终止容器。

# docker stop 7d1bb

此时在执行下docker container prune命令,会自动清除掉处于停滞状态的容器。

此外,还可以输入docker kill命令强制关闭容器。

可以用下面的命令来查看所有容器ID

# docker ps -qa

终止状态的容器可以通过docker start命令来重新启动

Docker restart 重启容器

进入容器

使用-d参数。容器会在后台运行,我们无法看到容器中的信息,需要进入容器操作,可以用attach或者exec命令。

Attach命令

这个是官方自带的命令

# docker run -itd ubuntu

80376feff7971c125cb0589a4ad585f4e2b9f1ef95c70d2ff71dce565d445ea0

# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

80376feff797 ubuntu “/bin/bash” 9 seconds ago Up 8 seconds dazzling_spence

# docker attach dazzling_spence

root@80376feff797:/#

这个命令不太方便推荐下面的命令。

Exec命令

我们直接进入一个容器,并启动一个bash

# docker exec -it 31c4 /bin/bash

删除容器

Docker rm命令,默认只能删除已经终止或退出状态的容器,如果在运行的容器不能删除,可以加-f参数,强制关闭容器,然后删除。

# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

31c4c1c26621 ubuntu “/bin/bash” 4 minutes ago Up 4 minutes hardcore_davinci

80376feff797 ubuntu “/bin/bash” 7 minutes ago Exited (0) 4 minutes ago dazzling_spence

# docker rm 31c4

Error response from daemon: You cannot remove a running container 31c4c1c26621732ef83348049ccdd5547742937a92bef7df148025d53cf3420a. Stop the container before attempting removal or force remove

# docker rm -f 31c4

31c4

# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

80376feff797 ubuntu “/bin/bash” 10 minutes ago Exited (0) 7 minutes ago dazzling_spence

查看容器

查看容器详情

Docker container inspect命令

# docker container inspect 8037

查看容器内进程

Docker top命令

查看统计信息

Docker stats 显示docker使用的cpu 内存等信息

王哥哥

Share
Published by
王哥哥