一、安装环境
操作系统:CentOS 7(建议用7或以上,因为6版本有部分功能不兼容)
二、Docker安装
1、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装所需软件包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3、设置仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4、安装最新版本
yum install docker-ce docker-ce-cli containerd.io
如果不是安装最新版本可以使用以下步骤:
查看可用版本:
yum list docker-ce --showduplicates | sort -r
然后使用命令安装对应得版本:
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
如:yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
5、安装完后启动
systemctl start docker
6、验证
docker run hello-world
三、Docker基本使用
1、容器的使用
直接输入docker命令可查看到docker命令的选项
启动容器
使用以下命令启动一个容器:
docker run -it ubuntu /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
如果需要退出则直接输入exit命令即可
如果需要后台运行可加上-d参数
docker run -itd --name ubuntu-test ubuntu /bin/bash
其中,-name是指定容器的名字,名字可以自定义
查看所有容器
docker ps -a
启动、关闭、重启一个已存在的容器
# 启动
docker start <容器ID>
# 停止
docker stop <容器ID>
# 重启
docker restart <容器ID>
进入和退出在后台运行的容器
进入容器,当从终端退出来的时候,container是会被关闭的
docker attach <container-id>
进入容器,退出终端的时候不会关闭container的main process
docker exec -t <container-id> bash
导入和导出容器
导出
docker export <容器ID> > 导出路径
如:docker export 1e560fca3906 > ubuntu.tar
导入
cat 路径 | docker import - 镜像名:标签名
如:cat docker/ubuntu.tar | docker import - test/ubuntu:v1
删除容器
docker rm -f <容器ID>
清空所有处于终止状态的容器:
docker container prune
使用容器运行一个web应用
载入镜像和启动容器
载入镜像
docker pull training/webapp
运行容器(其中P参数将容器内部使用的网络端口映射到我们使用的主机上)
docker run -d -P training/webapp python app.py
查看容器状态:
docker ps
此时发现多了端口的信息,docker开放了5000端口,映射到了主机的9001端口上。
可以通过 -p 参数来配置端口:
docker run -d -p 5000:5000 training/webapp python app.py
查看web应用程序的日志
其中-f让docker logs像tail -f一样输出
docker logs -f <容器ID或名字>
查看web应用程序容器的进程
docker top <容器ID或名字>
使用docker inspect来检查docker底层信息,它会返回一个json文件记录着容器的配置和状态信息
docker inspect <容器ID或名字>
停止、重启、移除web应用容器
停止
docker stop <容器ID或名字>
重启
docker restart <容器ID或名字>
移除(移除前必须停止)
docker rm <容器ID或名字>
2、镜像的使用
列出所有本地主机上的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
prom/prometheus latest 932c2dbe7d3e 3 weeks ago 231MB
列表各个列说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
说明:同一仓库可以有多个TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash
如果不指定一个镜像的版本标签,例如只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
获取新镜像
docker pull REPOSITORY:TAG
如:docker pull ubuntu:13.10
查找镜像
第一种方法是在docker hub网站上找:https://hub.docker.com/
第二种方法是使用docker search命令来搜索
如我们需要一个httpd的镜像来作为web服务
docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 4294 [OK]
列表各列说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
拖取镜像
拖取httpd镜像
docker pull httpd
拖取下来之后就可以使用这个镜像了
docker run httpd
删除镜像
删除httpd镜像
docker rmi httpd
构建镜像
构建镜像需要我们从零开始创建一个镜像,构建镜像分为手动构建和自动构建,这里我们采用Dockerfile自动构建的方式来构建镜像,因此,我们需要创建一个DockerFile文件,其中包含一组指令来告诉docker如何构建我们的镜像
创建docker使用的目录来规划存放dockerfile文件的目录(此步可忽略)
mkdir /home/docker
cd /home/docker
创建文件需要注意的是:D需要大写,当我们构建镜像的时候docker默认选取当前目录下的Dockerfile文件
[root@bogon ~]# vim DockerFile
然后在Dockerfile文件加入以下内容:
FROM centos:6.7
MAINTAINER Catke "catke@qq.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd catke
RUN /bin/echo 'catke:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
Dockerfile文件参数说明:
FROM (指定基础镜像)
MAINTAINER (指定维护者信息)
RUN (在命令前面加上RUN)
ADD (COPY文件,会自动解压,无法复制tar压缩文件,从上下文目录中复制文件或者目录到容器里指定路径,同等需求下,官方推荐使用COPY来实现)
WORKDIR (设置当前工作目录,类似于cd)
VOLUME (设置卷,挂载主机目录)
EXPOSE (指定对外的端口)
CMD (指定容器启动后要干的事情)
然后我们使用Dockerfile文件,通过docker build命令来构建一个镜像
说明:-t参数后面跟着的是REPOSITORY:TAG的格式,最后的“.”不要漏了,当然你可以修改构建的位置,“.”代表的是当前目录,
[root@bogon docker]# docker build -t centos:6.7 .
可以使用docker images命令来查看当前的镜像
然后我们使用这个镜像来启动一个容器,并且验证我们刚刚文件里面写的创建catke用户,结果如下:
创建镜像
当docker镜像库中的镜像不能满足我们的需求时,我们可以通过两种方式对镜像进行修改:
1、从已经创建的容器中更新镜像,并提交这个镜像
2、使用dockerfile指令来创建一个新的镜像
设置镜像标签
以刚刚构建的镜像为例
将IMAGE ID为0fc552672063的镜像的tag设置为test(说明,一个镜像可以对应多个tag)
docker tag 0fc552672063 centos:test
3、容器连接
端口映射
端口映射可以使用-p或者-P参数来实现,其中,-P是容器内部端口随机映射到主机端口,-p是容器内部端口绑定到主机端口
创建一个python应用容器,并将容器内部端口随机映射到主机端口
[root@bogon docker]# docker run -d -P training/webapp python app.py
查看容器情况
[root@bogon docker]# docker ps
可以看到当前容器端口9000绑定了5000端口
创建一个python应用容器,并将容器内部端口绑定映射到主机端口
docker run -d -p 5000:5000 training/webapp python app.py
查看容器情况
docker ps
同样的,可以绑定ip
创建一个python应用容器,并将容器内部端口指定映射到主机端口,并绑定127.0.0.1IP
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
如果要绑定udp端口,可以在端口后面加上/udp
docker run -d -p 127.00.1:5001:5000/udp training/webapp python app.py
docker容器互联
创建新的docker网络,其中-d参数指定docker网络类型,可以是bridge、overlay
docker network create -d bridge test-net
查看当前docker网络
[root@bogon docker]# docker network ls
运行一个容器,并使这个容器连接刚刚新建的网络
docker run -it --name test1 --network test-net ubuntu /bin/bash
打开一个新的客户端,再运行一个容器,同样连接这个网络
再运行一个容器,并使这个容器连接刚刚新建的网络
docker run -it --name test2 --network test-net ubuntu /bin/bash
分别在两个容器安装ping命令
apt-get update
apt install iputils-ping
在test1的容器上使用ping命令ping test2的容器
在test2的容器上使用ping命令ping test1的容器
配置DNS
docker run -it --rm host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
参数说明:
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
注意:如果在启动容器的时候没有指定dns信息,那么容器会默认使用主机上的/etc/resolv.conf的配置来配置DNS
4、仓库管理
docker仓库存放docker镜像的仓库,目前官方有一个公共的仓库:Docker Hub,大部分需求镜像都可以从这个镜像库上下载下来,地址是:https://hub.docker.com
基本操作:
-- 登录
docker login
-- 退出
docker logout
-- 查找镜像如sshd
docker search sshd
-- 拉取镜像到本地
docker pull sshd
-- 推送镜像到Docker Hub
docker push username/respositiry:tag