Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
按照我的理解,docker是将我们的程序,以及程序的相关依赖以镜像的形式保存,以容器的形式使用,镜像相当于程序的一个备份,使用这个镜像可以创建无数个相应的容器,程序被容器包裹,不受外界影响,可以移植到其他环境中。
写这篇博客的目的就是为了总结在学习docker的过程中遇到的一些问题,以及对docker常用的命令总结
docker的安装与卸载
我在学习过程中使用了Ubuntu和CentOS7安装docker,安装命令如下:
Ubuntu
docker可以使用多种方式安装,这里只记录较为方便的官方自动安装脚本的方式
使用官方自动安装脚本
使用官方自动安装脚本是最简单的一种安装方式了,可以避免一些问题的出现
命令行输入:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
如果出现命令未找到,那可能是没有安装curl,在命令行中输入apt-get install -y curl进行安装之后,在输入上述命令即可;如果是权限不足,则在命令前使用sudo提权
卸载
删除安装包
sudo apt-get purge docker-ce
删除镜像、容器、配置文件等内容
sudo rm -rf /var/lib/docker
CentOS
CentOS安装docker与Ubuntu差别不大
官方自动安装脚本
命令行输入:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
卸载
删除安装包
sudo apt-get purge docker-ce
删除镜像、容器、配置文件等内容
sudo rm -rf /var/lib/docker
docker的使用
docker配置镜像源站
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
- 网易 http://hub-mirror.c.163.com
- Docker中国区官方镜像 https://registry.docker-cn.com
- 中国科技大学 https://docker.mirrors.ustc.edu.cn
- 阿里云容器服务 https://cr.console.aliyun.com/(需要在首页点击“创建我的容器镜像” 得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyuncs.com”)
只需要使用vim编辑修改/etc/docker/daemon.json配置文件
加入以下内容
{
"registry-mirrors": ["加速地址"]
}
即可更换镜像源站,开启镜像加速
docker镜像使用
运行容器时,如果使用的镜像在本地不存在,那么就会从docker镜像仓库中下载,如果没有配置镜像源站,默认是从Docker Hub公共镜像源进行下载
下面列出常用的操作镜像的命令
列出本地仓库镜像
docker images
相关项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一个仓库源会有多个TAG,用来代表这个镜像的不同版本,就以mysql为例,mysql仓库源里会有5.7、8.2等不同版本,所以使用了REPOSITORY来标识镜像,TAG标识版本
如果不指定镜像TAG,则默认从仓库中拉取最后一个版本的镜像,同样以mysql为例,不指定TAG,则拉取的mysql为mysql:latest
拉取镜像
使用镜像创建容器时,如果镜像不存在会从仓库源中拉取,而我们也可以主动从仓库源中拉取镜像,这时就需要使用docker pull命令了
docker pull
搜索镜像
直接在各个镜像源站搜索镜像的方式就不用多说了,这里记录一下使用docker search命令的方式搜索镜像。比如说,我需要一个httpd的镜像,那就可以使用docker search命令
具体命令如下:
[root@GokouLuli999 ~]# docker search httpd
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否docker官方发布
- stars: 类似Github里的 star,表示点赞
- AUTOMATED: 自动构建。
删除镜像
镜像的删除比较简单,镜像删除使用 docker rmi 命令,比如删除 hello-world 镜像:
docker rmi hello-world
创建镜像
当 docker 镜像仓库中下载的镜像不能满足我们的需求时,可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
举例:
[root@Gokoululi999 ~]# docker run -it ubuntu:15.10 /bin/bash
参数说明:
- -i: 交互式操作
- -t: 终端
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
如果不指定镜像的版本标签,例如使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本
[root@Gokoululi999 ~]# docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- e218edb10161:容器 ID
- runoob/ubuntu:v2: 指定要创建的目标镜像名
可以使用 docker images 命令来查看新镜像 runoob/ubuntu:v2:
使用新镜像 runoob/ubuntu 来启动一个容器
[root@Gokoululi999 ~]# docker run -t -i runoob/ubuntu:v2 /bin/bash
构建镜像
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
[root@Gokoululi999 ~]# cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
[root@Gokoululi999 ~]# docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
可以使用新的镜像来创建容器
[root@Gokoululi999 ~]# docker run -t -i runoob/centos:6.7 /bin/bash
[root@Gokoululi999 ~]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)
从上面看到新镜像已经包含我们创建的用户 runoob。
设置镜像标签
可以使用 docker tag 命令,为镜像添加一个新的标签
[root@Gokoululi999 ~]# docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
docker容器使用
我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
获取镜像
如果我们本地没有 ubuntu 镜像,可以使用 docker pull 命令来载入 ubuntu 镜像
docker pull ubuntu
启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器
docker run -it ubuntu /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit
更多参数:
运行一个容器
docker run -it -p 8088:8088 -p 8089:8089 -p 8090:9090 -v /root/soft/docker:/root/soft/docker
-v /root/soft/dockertt:/root/soft/dockertt loen/rc /bin/bash
命令的格式:
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a
- --attach=[] 登录容器(以docker run -d启动的容器)
-c
- --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
- --cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
- --cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
- --cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
- --cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d
- --detach=false 指定容器运行于前台还是后台
- --device=[] 添加主机设备给容器,相当于设备直通
- --dns=[] 指定容器的dns服务器
- --dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
-e
- --env=[] 指定环境变量,容器中可以使用该环境变量
- --entrypoint="" 覆盖image的入口点
- --env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
- --expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
-h
- --hostname="" 指定容器的主机名
-i
- --interactive=false 打开STDIN,用于控制台交互
- --link=[] 指定容器间的关联,使用其他容器的IP、env等信息
- --lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
-m
- --memory="" 指定容器的内存上限
- --name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
- --net="bridge" 容器网络设置,待详述
-P
- --publish-all=false 指定容器暴露的端口,待详述
-p
- --publish=[] 指定容器暴露的端口,待详述
- --privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
- --restart="" 指定容器停止后的重启策略,待详述
- --rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
- --sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-t
- --tty=false 分配tty设备,该可以支持终端登录
-u
- --user="" 指定容器的用户
-v
- --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
- --volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
-w
- --workdir="" 指定容器的工作目录
详细讲解
端口暴露
-P参数:docker自动映射暴露端口;
docker run -d -P training/webapp //docker自动在host上打开49000到49900的端口,映射到容器(由镜像指定,或者--expose参数指定)的暴露端口
-p参数:指定端口或IP进行映射;
docker run -d -p 5000:80 training/webapp //host上5000号端口,映射到容器暴露的80端口
docker run -d -p 127.0.0.1:5000:80 training/webapp //host上127.0.0.1:5000号端口,映射到容器暴露的80端口
docker run -d -p 127.0.0.1::5000 training/webapp //host上127.0.0.1:随机端口,映射到容器暴露的80端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp //绑定udp端口
网络配置
--net=bridge: //使用docker daemon指定的网桥
--net=host: //容器使用主机的网络
--net=container:NAME_or_ID: //使用其他容器的网路,共享IP和PORT等网络资源
--net=none: //容器使用自己的网络(类似--net=bridge),但是不进行配置
启动已停止运行的容器
查看所有的容器(包括已停止)命令如下:
docker ps -a
使用 docker start 启动一个已停止的容器:
docker start b750bbbcfd88
后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d
指定容器的运行模式
docker run -itd --name ubuntu-test ubuntu /bin/bash
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
停止一个容器
停止容器的命令如下:
docker stop <容器 ID>
停止的容器可以通过 docker restart 重启:
docker restart <容器 ID>
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach
- docker exec:推荐使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止
attach 命令
docker attach 1e560fca3906
注意: 如果从这个容器退出,会导致容器的停止
exec 命令
docker exec -it 243c32535da7 /bin/bash
更多参数说明可使用 docker exec --help
命令查看。
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令
docker export 1e560fca3906 > ubuntu.tar
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
这样将导出容器快照到本地文件
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
此外,也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
删除容器使用 docker rm 命令:
docker rm -f 1e560fca3906