1 概念
1.1 基本概念
Docker daemon
守护进程,运行在宿主机上,用户通过DockerClient客户端Docker命令与Docker daemon交互。
Docker Client
Docker命令行工具。是用户使用Docker的主要方式。
Docker Image
镜像。简单说就相当于root文件系统
Docker Container
容器就是镜像的一个实例。容器创建、容器启动、容器停止、容器删除、容器暂停。
Docker Repository
仓库是一个代码的控制空心,作用就是保存镜像。
1.2 容器与系统
CoreOS、其他操作系统、容器的网络架构、容器编排、容器集群、容器监控等。
2 Docker环境搭建
2.1 CentOS7 安装Docker
前提:
- CentOS6.5 以上,内核3.10及以上
uname -a
- 更新yum源
yum update
- 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
- 替换阿里yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker-ce
yum install -y docker-ce
- 启动docker服务端守护进程
systemctl start docker
- 查看版本信息
docker version
- 设置开机自启
systemctl enable docker
2.2 配置阿里云加速镜像
登录阿里云平台后进入“容器镜像服务”->"镜像工具"->"镜像加速器"
配置镜像加速器地址需替换成自己的
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3 Docker 命令
3.1 基本命令
run命令:通过镜像创建并启动容器
- -i :交互式(可输入命令)
- -t :终端或模拟终端
- -d:以守护进程运行
- -p:指定端口
- -v:指定存储卷
- --name:自定义容器名称
- --restart=aways:当容器挂后自动重启
exit:退出
ps命令:查看容器状态 - -a:查看所有容器
- -a -q :展示所有容器ID
- -n:列出指定数量容器
#列出最近前5个容器
docker ps -a -n 3
start\stop\restar\ 命令: docker start *ID*
、docker stop *ID*
停止所有容器:
docker stop $(docker ps -a -q)
exec命令:进入已启动的容器 (注意:使用exec进入容器后exit退出时,容器不会关闭)
docker exec -i -t 容器ID /bin/bash
attach命令:进入已启动的容器,exit退出后,容器关闭(不推荐)
rm命令:删除容器 rm *ID1* *ID2* ....
# 删除所有容器
docker rm -f $(docker ps -a -q)
-f:强制删除容器
kill命令:杀死正在运行的容器
docker kill 容器ID
pause\unpause命令:暂停\回复
logs命令:查看日志
docker logs 容器ID
inspect命令:查看容器详细信息
docker inspect 容器ID
top命令:显示正在运行的容器进程信息
docker top 容器ID
3.2 容器管理
容器状态(STATUS)
- Created:创建
- Up:运行中
- Pause:暂停
- Exited:停止
top命令:查看容器中运行的进程信息
docker top 容器ID
diff命令:检测容器中的文件系统变动
stats命令:实时监控显示容器的资源使用情况
docker stats 容器ID
3.3 镜像
使用原则:有官方的就用官方镜像
查找镜像
#搜索httpd镜像
docker search httpd
拉取镜像
docker pull 镜像名称
(如果不指定版本号,默认获取最新稳定版本的镜像latest),本地镜像保存路径"/var/lib/docker"
镜像列表
#查看镜像列表
docker images
#查看所有镜像ID
docker images -q
镜像导出
docker save 镜像名称及版本 -o 导出的文件名称
docker save ubuntu:15.10 -o export-test.tar
删除镜像
docker rmi 镜像名称:版本
运行中的镜像需要先停掉再删除
- -f 强制删除。
#多版本冲突删除
docker rmi 镜像名称/镜像名称:版本号
#删除所有镜像
docker rmi -f $(docker images -q)
镜像标签
重命名:
docker tag 镜像ID 源(可自定义)/镜像名称:版本
镜像创建
- 镜像提交
docker commit
可以把容器打包成一个镜像,可以把容器你的数据也打包到镜像中。 - 镜像构建
- docker build
- dockerfile
镜像提交
将现有镜像push到docker hub仓库
-
登录
docker login
输入账号密码
-
自定义tag
docker tag nginx:latest qinjuncai/nginx:v1.0
-
推送
docker push qinjuncai/nginx:v1.0
3.4 仓库
3.4.1 公共仓库
DockerHub,参考官方说明
3.4.2 私有仓库
3.4.2.1 Docker-registry私有仓库
Docker公司提供:Docker-registry私有仓库组件
- 安装
## 拉取镜像
docker pull registry
## 启动容器
docker run -d -v /registry:/home/docker-registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest
- 验证
ip:5000/v2(http://192.168.88.101:5000/v2/)
- 推送镜像到私有仓库
# 重命名Tag
docker tag nginx:latest localhost:5000/nginx:v2.1
# 推送镜像
docker push localhost:5000/nginx:v2.1
-
拉取推送的镜像
客户端deamon.json
配置私有仓库地址
vi /etc/docker/daemon.json
#添加私有仓库地址
{
"insecure-registry": ["192.168.88.101:5000"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
#拉取镜像
docker pull 192.168.88.101:5000/nginx:v2.1
3.4.2.2 Harbor 私有仓库
VMWare公司(中国团队)提供:Harbor企业级开源组件(推荐)
特点: 安全、标识和管理、镜像赋值、LDAP、国际化、GItHub开源、图形化用户界面、部署简单
- docker-compose安装
Docker-compose GitHub地址
#安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 查看版本号,测试是否安装成功你可以通过修改URL中的版本,可以自定义您的需要的版本。
docker-compose version
- harbor安装
Harbor GitHub地址
下载离线包(600多M)
#解压
tar -xvf harbor-offline-installer-v1.10.10.tgz
cd harbor
#执行
./prepare
#修改配置.IP地址及端口修改(不能是localhost或127.0.0.1),admin密码也在此配置文件中
vi harbor.yml
#执行安装脚本
./install.sh
注意:如果不开启https 需注释掉harbor.html HTTPS部分内容,否则会报错
- 验证登录
安装成功
https://ip:端口(默认80,账号admin 密码:Harbor12345) - 使用
-
登录系统并创建项目
-
添加用户
系统管理-用户管理-创建用户 -
添加用户到项目中
项目-成员-添加用户-选择角色
-
配置镜像地址
vi /etc/docker/daemon.json
#添加私有仓库地址
{
# 这行是阿里云加速,需替换自己的
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"],
"insecure-registries":["192.168.88.101"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
- 登录仓库
docker login 192.168.88.101
#输入用户名密码
....
- 推送镜像到私有仓库
格式:docker tag 需要推送的镜像名称:版本 私有仓库IP/项目名称/镜像名称:版本
# 标记镜像
docker tag nginx:latest 192.168.88.101/test/nginx:v3.0
# 推送镜像
docker push 192.168.88.101/test/nginx:v3.0
- 拉取镜像
docker pull 192.168.88.101/test/nginx:v3.0
3.4.3 三方仓库
阿里云仓库,详见
3.5 基本命令小结
4 Dockerfile
4.1 命令
案例:通过dockerfile 创建镜像。拉取centos 并安装软件及开放端口
- 编写dockerfile
# 从哪一个基础镜像构建
FROM centos
# 定义作者信息
MAINTAINER 'qinjuncai@qq.com'
# 定义一个变量
ENV newpath /tmp
# 设置登录以后工作路径(落脚点)
WORKDIR $newpath
# 执行你要的操作
#RUN yum -y install net-tools
# 开放指定的端口
EXPOSE 80
EXPOSE 22
# 执行命令
CMD echo $newpath
CMD echo "success.....OK"
CMD /bin/bash
- 执行dockerfile
docker build -f dockerfile -t qinjuncai/centos:v1 .
- 查看dockerfile执行细节
docker history qinjuncai/centos:v1
5 容器网络
5.1 外部访问容器
端口映射:容器与宿主机之间进行通讯
- -p:小写的p指定端口映射 。宿主机:容器端口(多用于==生产环境==)
- -P:大写的P随机映射
#启动容器,将容器80端口映射到宿主机8080端口,将443端口映射到443
docker run -itd -p 8080:80 -p 443:443 nginx /bin/bash
#启动容器,映射端口,高可用
docker run -itd -p 80:80 --restart=always nginx /bin/bash
#启动容器,随机映射端口
docker run -d -P nginx
#适用于宿主机多网卡,指定IP及端口映射
docker run -itd -p 192.168.88.101:8080:80 nginx --name web01 nginx /bin/bash
#查看容器端口暴露情况
docker port 717a97e90432
端口的暴露:Dockerfile EXPOSE 80
5.2 容器访问容器(容器互联)
# 创建Nginx容器1,命名Nginx01 使用自定义网络test-net 宿主90端口映射容器80端口
docker run -itd -p 90:80 --name nginx01 --network test-net nginx
# 创建Nginx容器2,命名Nginx02 使用自定义网络test-net 宿主91端口映射容器80端口
docker run -itd -p 91:80 --name nginx02 --network test-net nginx
# 分别查看容器详细信息(获取容器IP)
docker inspect a013498701df
docker inspect c61aed657a25
# 容器1 IP 172.19.0.2 容器2 IP 172.19.0.3
# 进入容器1 ping 172.19.0.3 能ping通 说明容器互联成功
docker exec -it c61aed657a25 /bin/bash
5.3 容器网络的模式
5.3.1 四种容器网络模式
1.host 模式
容器与宿主机共享IP,可设置不同端口号
2. container 模式
整合个容器共享独立网卡和IP
3. none模式 :没有网卡,没有IP 没有路由信息 只有lo
4.bridge模式(默认):即桥接模式
每个虚拟机拥有独立的IP和网卡,多个容器之间隔离,可通过宿主机互相访问。
5.3.2 自定义网络
# 创建网络
docker network create -d bridge test-net
# 查看网络
docker network ls