引言
本文从“docker介绍”,“环境搭建”,“docker使用”三个方面介绍docker,内容简单,希望起到一个辅助梳理知识点入门的作用
1·docker介绍
docker是什么,引用百度百科的说法:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker使用Go语言编写,并且使用了一系列Linux内核提供的特性来实现其功能。
1.1·docker组件架构
docker客户端:docker客户端是用户与docker服务交互的窗口,就是我们在命令行用docker 命令
docker服务:有一个守护进程(docker daemon),监听来自客户端的请求,也就是命令,管理docker的镜像,容器,网络。磁盘等对象
镜像仓库:你需要任何镜像都可以从镜像仓库中获取,可以根据需要配置镜像源
1.2·核心概念
Docker使用的Linux核心模块功能包括下列各项:
- Cgroup – 用来分配硬件资源
- Namespace – 用来隔离不同Container的执行空间
- AUFS(chroot) – 用来建立不同Container的档案系统
- SELinux – 用来确保Container的网路的安全
- Netlink – 用来让不同Container之间的行程进行沟通
- Netfilter – 建立Container埠为基础的网路防火墙封包过滤
- AppArmor – 保护Container的网路及执行安全
- Linux Bridge – 让不同Container或不同主机上的Container能沟通
1.2.1·Docker namespace
通过抽象方法使得namespace中的进程看起来拥有它们自己的隔离的全局系统资源实例 命名空间是Linux内核强大的特性。每个容器都有自己的命名空间,运行在其中的应用都是在独立操作系统中运行一样。命名空间保证了容器之间彼此互不影响
一些Docker使用到的命名空间有:
- pid命名空间: 进程隔离(PID: Process ID)
- net命名空间: 管理网络接口(NET: Networking)
- ipc命名空间: 管理进程间通信资源 (IPC: InterProcess Communication)
- mnt命名空间: 管理挂载点 (MNT: Mount)
- uts命名空间: 隔离内核和版本标识 (UTS: Unix Timesharing System)
1.2.2·Docker CGroups
让容器受限制地使用系统资源,比如网络、磁盘、CPU以及内存等,也是为了让容器更可控。
1.3·容器和镜像
docker最重要的两个概念就是镜像和容器,用编程的方法来解释的话:
镜像就像是类,而容器就是实例化的对象
1.3.1·镜像
docker镜像是一个只读模板,可以用来创建docker容器。镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。它包含运行某个软件所需要的所有的内容,包括代码、运行时、库、环境变量、配置文件等。
任何镜像的创建会基于其他的父镜像,也就是说镜像是一层套一层,比如一个tomcat镜像,需要运行在centos/ubuntu上,那我们的tomcat镜像就会基于centos/ubuntu镜像创建。
1.3.2·容器
docker的容器是用镜像创建的运行实例,docker可以利用容器独立运行一个或一组应用。我们可以使用客户端或者API控制容器的启动、开始、停止、删除。每个容器之间是相互隔离的。
容器时没有单独自己的内核的,是共享宿主机内核的
1.4·容器创建的过程
- 拉取镜像,若本地已经存在该镜像,则不用到Docker仓库去拉取
- 使用镜像创建新的容器
- 分配union文件系统并且挂载一个可读写的层,任何修改容器的操作都会被记录在这个读写层上,你可以保存这些修改成新的镜像,也可以选择不保存,那么下次运行改镜像的时候所有修改操作都会被消除
- 分配网络/桥接接口,创建一个允许容器与本地主机通信的网络接口
- 设置ip地址,从池中寻找一个可用的ip地址附加到容器上,换句话说,localhost并不能访问到容器
- 运行你指定的程序
- 捕获并且提供应用输出:连接并且记录标准输出、输入和错误让你可以看到你的程序是如何运行的。
2·环境搭建
2.1·安装
2.1.1·yum安装
yum -y install docker-ce docker-ce-cli
2.1.1·离线安装
去官方得到源文件,放到你的服务器上,解压到你指定的安装目录:
官方下载地址:https://download.docker.com/linux/static/stable/x86_64/‘
我这里下载的是19.03.13版本
可以直接wget
wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.13.tgz
也可以下载后上传,然后解压安装
解压安装包:tar -zxvf docker-19.03.13.tgz
将解压出来的目录下的执行文件可瓯北到/usr/bin/下:cp docker/* /usr/bin/
这个时候就可以使用docker命令了,但是docker还没启动,所以命令会报错
可以将docker注册为service服务,新建/etc/systemd/system/docker.service文件,内容如下:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
然后:
添加执行权限:chmod +x /etc/systemd/system/docker.service
重新加载文件:systemctl daemon-reload
启动docker:systemctl start docker
这样就可以正常使用docker了
2.2·镜像源
如果要修改镜像源,可以修改文件/etc/docker/daemon.json(没有就创建)
{
"registry-mirrors" : [
"http://docker.mirrors.ustc.edu.cn",
"http://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"insecure-registries" : [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug" : true,
"experimental" : true
}
国内的docker镜像源有下面这些
Docker中国官方镜像加速
--registry-mirror=https://registry.docker-cn.com
网易163镜像加速
--registry-mirror=http://hub-mirror.c.163.com
中科大镜像加速
--registry-mirror=https://docker.mirrors.ustc.edu.cn
阿里云镜像加速
--registry-mirror=https://{your_id}.mirror.aliyuncs.com
daocloud镜像加速
--registry-mirror=http://{your_id}.m.daocloud.io
2.3·容器与镜像存储路径
docker镜像的默认存储路径是/var/lib/docker(docker info 命令也可以看到使用的存储路径)
可在文件/usr/lib/systemd/system/docker.service中修改下面内容:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
改为
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph /usr/local/docker
然后将原目录的文件都拷贝到新目录中去:
cp -rf /var/lib/docker/* /usr/local/docker /
然后重启启动docker
如果修改配置文件的方法不生效,可以直接用软连接的方式
mv /var/lib/docker /usr/local/docker
ln -s /usr/local/docker /var/lib/docker
3·docker使用
3.1·镜像
3.1.1·获取镜像
查找镜像:docker search httpd
获取镜像:docker pull httpd
删除镜像:docker rmi httpd
查看本地镜像:docker images
如:用docker pull 获取centos7的镜像之后,用docker images就可以看到了
3.1.2·生成镜像
docker commit :从容器创建一个新的镜像。
命令格式:docker commit [参数] 容器 [REPOSITORY[:TAG]]
- -a :提交的镜像作者;
- -c :使用Dockerfile指令来创建镜像;
- -m :提交时的说明文字;
- -p :在commit时,将容器暂停。
举例:
docker commit -a "dragon" -m "my nginx" 154b9e5bdfff mynginx:first
3.1.3·其他镜像常见命令
docker history : 查看指定镜像的创建历史。
docker tag : 标记本地镜像,将其归入某一仓库。
docker build 命令用于使用 Dockerfile 创建镜像。(后面单独讲解)
docker save : 将指定镜像保存成 tar 归档文件。
docker load : 导入使用 docker save命令导出的镜像。
docker import : 从归档文件中创建镜像。
3.2·容器
3.2.1·查看当前存在的容器
docker ps 命令可以查看当前服务器上在跑的容器的信息,其中的ID是比较重要的,通过ID可以对容器进行后续操作
docker ps -a 可以看到停止的docker
docker ps -l 查看最近创建的容器
3.2.2·容器创建/删除
【1】创建容器并启动:docker run
命令格式:docker run [参数] image [命令]
参数:
- -i :以交互模式运行容器,通常与 -t 同时使用;
- -t :为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- --name = xxx:给容器命名为xxx
- -d :后台运行容器,并返回容器ID
- -P: 随机端口映射,容器内部端口随机映射到主机的端口
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
- --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
- -h "docke_one": 指定容器的hostname;
- -e username="ritchie": 设置环境变量;
- --env-file=[]: 从指定文件读入环境变量;
- -cpuset="0-2" or --cpuset="0,1,2" :绑定容器到指定CPU运行;
- -m :设置容器使用内存最大值;
- -net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- --link=[] :添加链接到另一个容器;
- -expose=[] :开放一个端口或一组端口;
- --volume , -v: 绑定一个卷
创建容器,并以命令行模式进入该容器
docker run -it centos:centos7 /bin/bash
创建容器,后台运行
docker run -itd --name wxl_test2 centos:centos7 /bin/bash
创建容器(容器中使用systemctl,service命令报错就这样创建)
docker run -it -p 127.0.0.1::22 --name dragon4 --privileged=true centos:centos7 /usr/sbin/init
【2】创建容器不启动:docker create
命令格式:docker create [参数] IMAGE [命令]
举例:docker create --name mynginx nginx:latest
【3】删除容器:docker rm
命令格式:docker rm [参数] 容器_id [容器 ...]
- -f :通过 SIGKILL 信号强制删除一个运行中的容器。
- -l :移除容器间的网络连接,而非容器本身。
- -v :删除与容器关联的卷。
3.2.2·启停/重启容器
命令格式:docker start/stop/restart 容器
3.3.3·进入容器
【1】docker attach
命令格式:docker attach 容器_ID
attach命令进入容器后推出,会导致容器停止
如:
attach之前,de40f9c647a2容器是up的
attach进入并退出之后,de40f9c647a2容器就停止了
【2】docker exec
命令格式:docker exec [参数] 容器 COMMAND [ARG...]
- -d :分离模式: 在后台运行
- -i :即使没有附加也保持STDIN 打开
- -t :分配一个伪终端
如:
在容器 154b9e5bdfff 中开启一个交互模式的终端:
docker exec -it 154b9e5bdfff /bin/bash
3.3.4·其他常用操作命令
【1】docker kill:杀掉一个运行中的容器
命令格式:docker kill [参数] 容器 [容器...]
参数:-s :向容器发送一个信号
举例:docker kill -s KILL mydocker
【2】docker pause / docker unpause :暂停/恢复容器中所有的进程
命令格式:docker pause/unpause 容器 [容器...]
举例:docker pause mydocker
【3】docker logs:获取容器的日志
命令格式:docker logs 容器
举例如下,获取到了容器中的历史操作命令
【4】docker port :列出指定的容器的端口映射
命令格式: docker port 容器
3.3·其他常见处理
3.3.1·容器端口映射
【1】docker run -P (大写)
将容器内部开放的网络端口随机映射到宿主机的一个端口上
如:
docker run -it -P --name dragon --privileged=true centos:centos7 /usr/sbin/init
【2】docker run -p (小写)
指定要映射的端口,一个指定端口上只可以绑定一个容器
指定主机一个端口映射到容器的指定端口:
docker run -it -p 127.0.0.1:8888:22 --name dragon4 --privileged=true centos:centos7 /usr/sbin/init
随机指定主机一个端口映射到容器的指定端口:
docker run -it -p 127.0.0.1::22 --name dragon4 --privileged=true centos:centos7 /usr/sbin/init
指定主机一个端口映射到容器的指定端口,不指定IP(映射所有接口地址):
docker run -it -p 8888:22 --name dragon4 --privileged=true centos:centos7 /usr/sbin/init
【3】查看当前端口映射
docker port 容器
【4】修改已经存在的容器的端口映射
要么废掉容器,重新生成容器的时候加上端口映射,但这样不推荐,可以先停止容器,然后直接修改对应容器的配置文件hostconfig.json
先用docker info看下自己docker的存储路径
我这里的存储路径如下
对应容器的配置文件如下:
/usr/local/docker/containers/9971531d00113215718bc587d5e0cd0456e60347b1b4eb43c3f77b6cfd39826e/hostconfig.json
找到其中的PortBindings内容进行修改,例如我修改的容器中的原内容如下,如果需要添加,直接修改
"PortBindings":{
"22/tcp": [
{"HostIp":"127.0.0.1","HostPort":""}
]
}
3.3.2·容器存储映射
docker存储映射是很常用和有用的,可以在容器中映射目录到宿主机的目录上,例如配置文件,程序包等等都可以放在映射的目录上
命令格式:docker -v 物理机文件夹:容器文件夹 镜像
举例:将宿主机/root/wxl/目录映射成容器中的/data_wxl 目录
docker run -d -v /root/wxl/:/data_wxl httpd
在容器中df -h也是可以看到