Docker核心概念
镜像是一个只读的模板,类似于安装系统时用到的ISO 文件,通过镜像来完成各种应用的部署。
容器可以被启动、开始、停止、删除等,每个容器间都是相互隔离的。
仓库是一个存放镜像的场所,仓库分为公共仓库和私有仓库。最大的公共仓库是Docker hub (https://hub.docker.com/), 国内公共仓库是http://www.dockerpool.com/
注意:镜像类似于操作系统,容器类似于虚拟机本身。
安装Docker
Docker安装文档: https://docs.docker.com/install。
Windows 系统安装Docker:
1. 操作系统必须是Windows 10 或Windows Server 2016 以上的系统,,而且要支持Hyper-V 。
2. 下载Docker for Windows ( Stable ),双击Docker 的安装图标进行安装,完成后会在桌面上创建一个快捷方式,双击快捷方式即可启动Docker。
启动Docker 时提示未开启Hyper-V 虚拟化,单击OK 按钮即可。
https://docs.docker.com/desktop/windows/install/
3. 命令行运行docker version或docker -version检验安装成功。
CentOS 7 系统安装Docker
1. 下载yum源
~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
2. yum 命令安装docker-ce ,运行命令如下。
~]# yum install -y docker-ce
使用yum 命令安装docker-ce 较慢,可到GitLab 中下载docker-ce 的RPM 包,下载后上传至Linux 服务器中,再使用yum 命令安装可自动解决依赖关系。
3. 启动Docker 服务,添加开机自启动,运行命令如下。
~]# systemctl enable docker.service
~]# systemctl start docker.service
4. 启动后可以查看默认在iptables 防火墙中生成的一些关于Docker 的规则
~]# iptables -nvL
Docker镜像管理
下载Docker 镜像
Docker 镜像可以从Docker 的官方网站下载
~]# docker pull centos
设置阿里云Docker 加速器
1. 下载阿里云Docker 加速器
<1>. 登录阿里云网站( https://cr.console.aliyun.com),输入用户名和|密码, 登录成功后单击“镜像加速器”→“您的专属加速器地址”
<2>. 在/etc/docker/daemon.json 配置文件中添加镜像加速器网址链接,然后重启Docker 服务。
~]# vim /etc/docker/daemon . json
{ "registry-mirrors": ["https://ia0t2gyi.mirror.aliyuncs.com"]}
~]# systemctl daemon-reload
~]# systemctl restart docker.service
2. 设置Docker Hub Mirror 加速器
Docker Hub Mirror 加速器获取网址是https://www.daocloud.io/mirror#acceleratordoc
直接运行curl 命令会自动创建, 运行命令如下。
~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http : //ff33ccad .m. daocloud . io
~]# systemctl daemon-reload
~]# systemctl restart docker.service
Docker 基本命令
~]# docker help
Usage: docker [OPTIONS] COMMAND
......
~]# docker help cp
等价于 ~]# docker cp --help
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
1. 查看docker版本信息 ~]# docker version
~]# docker version
Client:
Version: 18.06.1-ce
API version: 1.38
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:23:03 2018
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.1-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: e68fc7a
Built: Tue Aug 21 17:25:29 2018
OS/Arch: linux/amd64
Experimental: false
2. 查看docker 基本信息
~]# docker -D info
3. 查看本地都有哪些镜像
~]# docker images
~]# docker images ls
4. 搜索镜像docker search:模糊匹配
~]# docker search jumpserver
5. 给镜像打标签docker tag,打完标签后会生成一个新的镜像,但是Image ID 不会发生变化
~]# docker tag centos humingzhe #REPOSITORY由centos===》重新生成humingzhe
也可以直接给imageid打tag
~]# docker tag 147f99d45b9f test
6. 镜像启动为容器,默认在后台启动,不会进入交互命令行。
~]# docker run -itd centos 32a92fbcead96a2407996e2c57clb2b44dbfldla93f0a9c63046a6fa47f8 79ba
-i i在项表示让容器的标准输入打开
-t 选项表示分配一个伪终端,
-d 选项表示后台启动。
-i 、-t 、-d 选项需放在镜像名字前面。
7. 查看运行的容器,docker ps
~]# docker ps
~]# docker ps -a
~]# docker container ls
~]# docker container ls -a
加上 -a 选项可查看所有的容器,包括未运行的容器,
8. 删除指定的镜像 docker rmi
~]# docker rmi centos
rmi 命令后面的参数可以是tag , 如果是tag ,则表示删除该tag 。
当后面的镜像参数为Image ID 时,会彻底删除整个镜像,所有的标签也会被一同删除。
创建镜像
直接从官网pull
通过容器创建镜像
镜像可以从官网通过pull 命令直接获取,也可以自定义
~]# docker commit - m "install net-tools" -a "humingzhe" f6e060600b33 centos_with_nettools
-m 选项后面可加改动信息,
-a 选项用于指定与作者相关的信息
f6e060600b33e为容器ID , ID 后面是新容器的名称,如centos_with_nettools
通过模板创建镜像
通过模板导入镜像
1. 下载模板
在openvz.org 网站下载模板,国内下载速度较慢,我们可以到国内已经下载的GitLab上下载:比如CentOS 6 的minimal 模板,
~]# wget http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
~]# du -sh centos-6-x86-minimal.tar.gz
2. 导入下载完成的CentOS 6 操作系统模板,导入成功后使用docker images 命令可查看导入的镜像
~]# cat centos-6-x86-minimal.tar.gz | docker import - centos6
sha256:37814bd86e07fae34d432305c6f120544084760fa4969b920643648d8c8da6db
~]# docker images|grep -i centos6
centos6 latest 37814bd86e07 32 seconds ago 512MB
通过镜像导出文件,然后导入
可以通过模板导入镜像,也可以导出,运行命令如
~]# docker save -o centos7_with_nettools.tar
~]# du -sh centos7 centos7_with_nettools.tar
通过文件恢复镜像
通过镜像导出的文件是可以恢复至本地镜像的, 恢复时可使用 --input 命令或反向重定向
~]# docker help load
-i, --input string Read from tar archive file, instead of STDIN
~]# docker load --input centos7_with_nettools.tar
~]# docker load < centos7_with_nettools.tar
Docker的基本管理
创建容器: docker create 命令,但并未运行
~]# docker create -it ubuntu bash
#查看docker ps -a,注意~]# docker ps查看不到,因为尚未运行
~]# docker ps -a
启动容器:docker start containerid
~]# docker start ${containerid}
~]# docker restart ${containerid}
关闭容器
~]# docker stop ${containerid}
先创建容器,然后启动容器 ~]# docker run
~]# docker run -d centos bash
docker run -name 命令可以给容器自定义名字
~]# docker run -name test -d centos bash
docker run -rm 命令可以让容器退出井删除它
~)# docker run --rm -it centos bash -c "sleep 30"
获取日志
docker logs ${containerid}
删除容器 docker rm
docker rm ${containerid}
如果容器处于运行状态可以加 -f选项
导出容器docker export 并且可以迁移到其他服务器:cat filename | docker import - [镜像名]命令
docker export ${containerid} > ${filename}.tar
cat ${filename}.tar | docker import - ${imagename}
Docker 仓库管理
镜像是从官网的公共仓库中直接拉取的,公共仓库所有的人都可以使用,很多企业做的项目不想公开发布,可以使用私有仓库
1. 用registry 镜像在本地搭建私有Docker仓库(类似于GitLab 私有库)
~]# docker pull registry
-p 选项可以把容器的端口映射到宿主机上,冒号左边是宿主机监听端口,冒号右边是容器监听端口。
~]# docker run -d -p 5000:5000 registry
2. 将CentOS 6 镜像传到私有仓库上,上传前要给CentOS 6 镜像打标签
~]# docker tag centos6 192.168.222.131:5000/centos6
3. 使用docker push 把标记后的镜像推送至私有仓库
~]# docker push 192.168.222.131:5000/centos6
注意:如果推送后报错,提示要输入HTTPS,若不想使用HTTPS,可以编辑 /etc/docker/daemon.json 指定一个私有仓库
~]# vim /etc/docker/daemon.json
{"insecure-registries":["192.168.222.131:5000"]}
~]# systemctl daemon-reload
~]# systemctl restart docker.service
4. 重启Docker 服务后, registry 处于停止状态, 需要启动后再进行推送
~]# docker start ${registry_containerid}
~]# docker push 192.168.222.131:5000/centos6
使用 ~]# curl 127.0.0.l:5000/v2/_catalog 命令可以查看推送到私有库中的镜像
~]# curl 127.0.0.l:5000/v2/_catalog
{"repositories":["centos6"]}
5. 使用docker pull +私有仓库IP+ Port 命令可下载私有库中的镜像
~]# docker pull 192.168.222.131:5000/ubuntu
Docker 数据管理
容器是由镜像启动的,无论是关闭容器, 连是删除容器, 容器中存储的数据和更改的数据都会消失
可以把宿主机的某个目录挂载到容器中,如创建 /data/ 目录,将容器生成的新数据全部写到 /data/ 目录下,也就是写到宿主机的磁盘中
~]# docker run -itd -v /data/:/data/ centos bash
冒号前面的 /data/ 是宿主机的本地目录,
冒号后面的 /data/ 是容器的目录,该目录如果不存在,则会在容器中自动创建。
【注意】挂载目录时可指定容器名称,如果不指定, 则会随机定义。上面随机定义的名称是 unruffled_euclid
docker run -tid -v 命令支持另外一种写法,可以不加冒号。如果不加冒号,就不需要把宿主机的目录做映射。
-v 选项的意思是把该目录作为一个公共的目录,即要做一个数据卷容器
~)# docker run - itd -v /data/ --name unruffled_euclid centos bash
当需要定义多个容器共享数据时,可以搭建一个专门的数据卷容器, 其他容器直接挂载该数据卷即可, 类似于Linux 中的NFS
~)# docker run -itd --volumes-from unruffled_euclid centos6 bash
Docker数据卷备份与恢复
数据备份
数据卷容器给本地宿主机目录做映射,根本不需要备份,只要定期复制硬盘数据即可。
如果没有做映射, 直接执行docker run -v /data/ 需要借助中间容器进行备份。
1. 在宿主机磁盘上创建一个 /data/backup 目录
2. 再用 unruffled_euclid 数据卷新创建一个容器,同时把本地创建的 /data/backup 目录挂载到该容器的 /bak 目录下,容器的/bak 目录下新建文件,就可以直接在/data/ backup/目录中看到
3. 最后把数据卷容器中的/data/ 目录下的文件打包成data.tar 文件并放到/bak 目录下,运行命令如下。
~]# docker run --volumes-from unruffled_euclid -v /data/backup/:/bak centos tar cvf /bak/data.tar /data/
~]# ls /data/backup/
Docker 数据卷恢复
先创建一个数据卷容器,再创建一个新的容器, 并挂载该数据卷容器, 最后将data.tar 包进行解包,运行命令如下。
~]# docker run -itd -v /data/ --name unruffled_euclid2 centos bash
f03b7lc8761630e57783f7909a203904 d 27ef64125cf83e51 89903b6 61e9116c
~]# docker exec -it f03b71c8 bash
/ # ls /data/
/ # exit
~]# docker run --volumes-from unruffled_euclid2 -v /data/backup/:/bak centos tar xf /bak/data.tar
~]# docker exec -it f03b71c8 bash
/] # ls /data/
backup humingzhe . cn humingzhe. com mariadb mongodb mysq l redis
Docker 网络模式与外部访问容器
Docker 共有4 种网络模式
1. host 模式: 在执行docker run 命令时用 --net=host 选项指定,该模式下Docker 使用的网络和宿主机使用的网络是一样的,在容器内看到的网卡IP 就是宿主机的IP。
2. container 模式:用选项 --net=container: container_id/container_name 指定,该模式是多个容器共同使用网络,看到的IP 都是一样的。
3. none 模式:用 --net=none 选项指定,该模式下不会设置任何网络。
4. bridge 模式:用 --net=bridge 选项指定, 是Docker 默认的网络模式。该模式会为每个容器分配一个独立的Network Namespace, 类似于VMWare 的NAT 网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间可以通信。
外部访问容器
Docker 宿主机启动容器监听的是80 端口,但是容器本身只在局域网内生效,宿主机之外的服务器是访问不到,要想其他的服务器也能访问,可以做端口映射。
进入一个容器,在容器中安装Nginx 服务,运行命令如下。
~]# docker exec -it e9d0ab bash
/]# yum install -y epel-release
/]# yum install - y nginx
/]#rpm -qa nginx
nginx-1.12.2-1.el7.x86 64
将容器导出为镜像,再使用新镜像创建容器并指定端口映射,运行命令如下。
~]# docker commit - m "install nginx" -a "humingzhe" e9d0abd69350 centos_with_nginx
~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_with_nginx latest c48f60c0a154 13 seconds ago 389MB
~]# docker run -itd -p 8888:80 centos_with_nginx bash
hostPort:containerPort (映射指定地址的指定端口)
~]# docker ps
如果新建的容器启动Nginx 或httpd 服务时报Failed to get D-Bus connection:Operation not permitted 错误,在创建容器时加上一privileged -e "container-docker"选项
设置桥接网络
Docker 默认的桥接网卡是 docker0。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机 上看一般叫做 veth* 而 Docker 只是把所有这些网卡桥接在一起
pipework 属于第三方开源网络工具,它能够实现跨宿主机容器网络互连
1.设置网卡
进入宿主机网卡设置目录,通过ifcfg-ens33 网卡复制一个新网卡,如br0 网卡
~]# cd /etc/sysconfig/network-scripts/
~]# cp ifcfg-ens33 ifcfg-br0
~]# vi ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
编辑ens33网卡,注释掉UUID 、IPADDR 、GATEWAY 、NETMASK 和DNS,新增BRIDGE=br0
~]# vim ifcfg-ens33
#UUID=7cdel071-823a-4dlf-a7a5-82dd46e969f4
#IPADDR=l92.168.222.131
#GATEWAY=192.168.222.2
#NETMASK=255.255.255.0
#DNS1=114.114.114.114
BRIDGE=br0
网卡设置后重启网络服务(设置成功可ping 通,失败无法ping 通, 终端也会断开〉, 运行ifconfig 命令即可看到br0网卡
2. 安装pipework 工具
~]# git clone https://github.com/jpetazzo/pipework
~]# cd pipework/
~]# cp pipework /usr/local/bin/
~]# pipework
3. 开启一个容器,并给刚开启的容器设置IP ,然后进入容器,使用ifconfig 命令查看
~]# docker run -itd --net=none centos_with_nginx bash =========>容器id:8caaf8537
~]# docker exec -it 8caaf853 bash
/)# exit
~]# pipework br0 8caaf8537
192.168.222.136/[email protected]
192.168.222.136 是容器的IP,@后面的IP 是网关IP。
若想使用LNMP 或SSHD等一些服务,则需要安装相应软件包,如安装Nginx 服务,安装后启动即可在浏览器中进行访问。
~]# docker exec - it 8caaf853 bash
/)# ifconfig
/)# ping humingzhe.com #可以ping 通,说明是可以连接外网的
DockerFile创建镜像
DockerFile 格式
1. FROM 用于指定基于哪个镜像, 格式是FROM
FROM centos:latest
2. MAINTAINER 用于指定作者信息,格式是MAINTAIN
3. RUN 是镜像操作指令,格式是RUN
RUN ["/bin/bash","-c","echo hello"]
4. CMD 用于执行一些命令,它有3 种语法格式, 与RUN的语法格式类似, CMD指定容器启动时用到的命令只能有一条。
CMD ["executable","paraml","param2"]
CMD command paraml param2
CMD ["paraml","param2"]
CMD ["/bin/bash ","/usr/local/nginx/sbin/nginx","-c"," /usr/local/nginx/conf/nginx.conf" ]
5. EXPOSE 是用来暴露端口的命令
EXPOSE 22 80 8443 #把22 端口、80 端口、8443 端口暴露
注意
在启动容器时,可以加上-P (大写)选项让系统自动分配端口。如果想指定具体的端口,可使用-p (小写)选项来指定。
6. ENV 用来定义环境变量,格式是<key>
注意:ENV 主要为后续的RUN 指令提供一个环境变量,也可以自定义一些环境变量,如ENV MYSQL_version5.70
7. ADD 命令是将本地的文件或目录复制到容器的某个目录下。其中,源为DockerFile 所在目录的相对路径,也可以是URL
ADD
8. COPY 命令和ADD 命令类似,语法格式也一致,不同的是COPY 命令不支持URL 远程下载。
9. ENTRYPOINT 命令的格式类似于CMD 命令的格式,容器启动时要执行的命令也类似于CMD 命令,只有一条生效,如果写多条语句,只有最后一条语句会生效。
不同的是, CMD 可以被docker run 命令指定覆盖,而ENTRYPOINT 不能被覆盖。
ENTRYPOINT 不会被覆盖,而且比CMD 或docker run 指定的命令要靠前执行
ENTRYPOINT ["echo","test"] 。执行docke1 run - it humingzhe 123 命令会先输出test,再输出123
10. VOLUME 是用来指定挂载点的,可以创建一个从本地或其他容器挂载的挂载点,格式是VOLUME ["/data"]
11. USER 指定运行容器的用户,恪式是USER daemon 。
12. WORKDIR 用于指定一个目录, 指定目录后, 在目录下进行一些操作,如运行一些命令时,先进入到路径下, 或者在启动容器时,使用CMD 、ENTRYPOINT 指定工作目录。
~]# vim Dockerfile
创建镜像
~]# docker build -t centos nginx
docker compose 部署服务与示例
使用docker-compose 命令可以快捷、高效地管理容器的启动、停止、重启等操作, 类似于Linux 中的shell脚本,基于yaml 语法,在YAML 文件中可以描述应用的架构,比如使用的镜像、数据卷、网络模式、监昕端口等信息。也可以在一个compose 文件中定义-个多容器的应用(比如jumpserver),然后通过该compose 启动这个应用。
1. 下载最新版本的docker compose
~)# curl -L https://github.com/docker/compose/releases/download/1.10.0-rcl/docker-compose-`uname -s`-`uname -m` > /usr/local /bin/docker-compose
~]# du -sh /usr/local/bin/docker-compose
~]# chmod 755 !$
~]# docker-compose version
2. 编辑docker-compose.yml 配置文件
使用docker-compose up 命令启动配置文件中定义的容器,运行命令如下。
~]# docker-compose up -d
使用docker-compose stop 命令可以停止配置文件中定义的容器
~]# docker-compose stop
更多查看
~]# docker-compose --help
docker-compose 语法的参考文档网址是http://www.web3.xin/index/article/182.html
Docker 官方的GitHub提供的一些Dockerfile优秀案例。https://github.com/docker-library
【补充】在docker容器中安装软件,并重新生成镜像
1、首先应该进入已经运行的容器:
docker exec -it [容器名或容器ID] /bin/bash
2、在容器里查看镜像所使用的的Linux版本
cat /etc/issue
/ # cat /etc/issue
Welcome to Alpine Linux 3.9
Kernel \r on an \m (\l)
【注意】
Alpine 软件管理器使用的是apk
Centos 软件管理器使用的是yum
ubuntu 软件管理器使用的是apt-get
3、更新apk管理仓库
apk update
4、安装软件
apk add 工具名称 如:
apk add ipmitool
5、提交已修改或者安装过软件的容器,生成新的镜像
docker commit
container_id :修改容器的ID
image_name : 镜像名称可以自己定义注:之后就可以对生成的镜像进行打包,移植到其他宿主机上运行(特别是离线环境下)。
【补充安装yum】
新建一个目录用来保存yum安装包
mkdir install
进入文件夹并输入命令
wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz
解压
tar -xvf yum-3.2.28.tar.gz
重点:解压后先不着急安装,手动创建一个yum的conf文件,不然会报找不到文件的错yum.cli:Config Error: Error accessing file for config file:///etc/
touch /etc/yum.conf
进入yum目录,脚本安装
cd yum-3.2.28
./yummain.py install yum
期间会提示安装新版本,y回车即可