docker 01
docker
docker的安装
1、安装源
在Linux系统中,可以通过一键命令快速安装Docker。以下是基于Debian和Ubuntu系统的安装命令:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
----------------------------------------------老版本的安装方式----------------------------------
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
如果你使用的是基于Red Hat的系统(如CentOS、Fedora等),可以使用以下命令:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
对于新版本的CentOS和Fedora,你可能需要使用dnf代替yum。
确保Docker服务启动并自动启动:
sudo systemctl start docker
sudo systemctl enable docker
安装docker
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# yum的工具包 安装数据存储的数据包
# Step 2: 添加软件源信息 ----- 指定阿里云的安装源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
systemctl enable docker
# 开机启动
阿里云详细介绍
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.12c21b11gItGnB
2、阿里云的镜像加速服务
阿里云 为用户提供不同操作系统的加速地址
1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce
2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bl7pyv8i.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
容器的执行过程
docker cli 发出命令 到docker server ,daemon 守护进程 启动容器,没有镜像的话,从hub中拉取镜像, 暴露服务
1、镜像
docker pull 下载镜像
docker images ps 查看镜像
docker rmi -f 镜像id 强制删除镜像
2、容器启动
容器的生命周期
docker create nginx # 创建容器 # stop的状态
docker start nginx # 启动容器 # stop状态
docker run nginx # 创建容器 + 启动容器的结合 # 启动的状态
docker stop nignx # 停止 容器
docker rm nignx # 删除 容器
docker pause nginx # 暂停状态
docker unpause nginx # 恢复start状态
容器的操作
docker run tomcat # 前台 启动一个容器
-p 进行宿主机和容器的端口映射的参数
docker run -p 80:8080 tomcat
# 前面的80是宿主机的端口 后面的8080 是容器的端口
docker run nginx # 前台启动容器 ,夯住了 ,ctrl + c 中止
docker run -d nginx # -d 后台运行容器
docker rm -f 容器id 强制删除正在运行的容器
docker exec -it nginx_test
# exec 在容器中执行命令
# it 采用交互方式执行命令
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
eg
docker exec tomcattest ls
# 只执行容器内的命令
docker exec -it tomcattest /bin/bash
# 提供交互式的命令终端解释器
# 退出
exit
build编译镜像
docfile镜像的描述文件
dockerfile 文件
FROM tomcat:latest # 设置基本镜像,尽量使用官方镜像
MAINTAINER DJ # 说明信息
LABEL version = 1.0 # 版本号信息
LABEL description = "描述信息"
WORKDIR /usr/local/tomcat/webapps # 设置当前的工作目录,没有的话,自动创建,并且切换到当前工作目录,尽量使用绝对目录
ADD docker-web ./docweb-web # 复制dockerfile同目录下的文件或者目录 复制到 容器内的 workdir目录下
ADD docker-web.tar.gz ./docweb-web # 支持解压文件的功能 ,支持远程文件的抓取
COPY 和 ADD的含义基本一致
ENV PYTHON /usr/local/pyhton2.7 # 环境变量的设定 尽量使用环境变量提高程序的维护性
RUN ${PYTHON} test.py
docker build -t baidu.com/mytomcat:1.0 /server/ 文件所在目录 相对目录和绝对目录
# 一定要有目录
容器执行命令
RUN # 在build 构建时 执行命令
# 两种命令格式
shell 命令格式: RUN yum install -y tree ### 派生出一个子进程,在子进程中执行命令,命令执行结束,子进程销毁
exec 命令格式 : RUN ["yum","install","-y","tree"] ## 创建exec进程,替换当前进程 ,保持 PID不变
ENTRYPOINT # 容器启动时执行的命令
# 入口点 只有最后一个ENTRYPOINT 会被执行
eg
ENTRYPOINT ["ps"]
CMD # 容器启动后执行默认的命令或者 参数 如果出现多个cmd,也是执行最后一个
docker run test.com/centos:1.0 -aux 作为 ENTRYPOINT的参数 执行
# 容器启动时 run命令的附加的指令 在dockerfile的 cmd命令 会被忽略
# ps 命令就是 附件的指令 那么dockerfile里的CMD [" -ef "] 命令就不被执行
FROM centos:latest
MAINTAINER DJ
ENTRYPOINT ["ps"]
CMD ["-ef"]
# 容器启动后 默认参数被替换 如果没有 新的参数 的话,使用cmd的默认参数
docker run test.com/centos:1.0 -aux
基础镜像的构建
FROM #来源基本镜像
MAINTAINER DJ # 备注信息
RUN # 构建命令执行
WORKDIR # 切换工作目录
ADD # 复制文件 解压文件
EXPOSE 80 # 暴露端口号
CMD # 容器启动后执行的文件
查看镜像的dockerfile的内容
docker history redis
镜像的使用
1、容器镜像的导入和导出
持久化docker的镜像或容器的方法
Docker的镜像和容器可以有两种方式来导出
docker save #ID or #Name
docker export #ID or #Name
docker save和docker export的区别
对于Docker Save方法,会保存该镜像的所有历史记录
对于Docker Export 方法,不会保留历史记录,即没有commit历史
docker save保存的是镜像(image),docker export保存的是容器(container);
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
2 导出命令
save命令
docker save [options] images [images...]
示例
docker save -o nginx.tar nginx:latest
或
docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
export命令
docker export [options] container
示例
docker export -o nginx-test.tar nginx-test
docker export #ID or #Name > /home/export.tar
其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)
3 导入命令
导入命令
load命令
docker load [options]
示例
docker load -i nginx.tar
或
docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
import命令
docker import [options] file|URL|- [REPOSITORY[:TAG]]
示例
docker import nginx-test.tar nginx:imp
或
cat nginx-test.tar | docker import - nginx:imp
容器的通信
单向通信 --link
[root@chihujing ~]# docker run -d --name tomcat -p 80:8080 tomcat:latest
50a29018b559e5066be4a00eb5422b7d74d41d647565b98f82268b102d37b6da
[root@chihujing ~]# docker run -d --name centos --link=tomcat -it centos:latest /bin/bash
ca1497663e393d360fc8cdb65fd7ad903f8215ac28f849d9f77a845abc0dd14d
[root@chihujing ~]#
[root@chihujing ~]# docker exec -it centos /bin/bash
[root@ca1497663e39 /]# ping tomcat
PING tomcat (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat (172.17.0.2): icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from tomcat (172.17.0.2): icmp_seq=2 ttl=64 time=0.035 ms
^C
--- tomcat ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.035/0.048/0.062/0.015 ms
# 容器间的单向通信是把 容器的名字 和ip地址 做了本地的域名解析
[root@ca1497663e39 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat 50a29018b559
172.17.0.3 ca1497663e39
双向通信 创建网桥
network create -d bridge my-bridge
# 创建网桥
docker run -d --name tomcat -p 80:8080 tomcat:latest
docker run -d --name centos -it centos:latest /bin/bash
# 创建容器
docker network connect my-bridge tomcat
docker network connect my-bridge centos
# 把容器加入到 网桥内
docker network inspect my-bridge
# 查看 网桥的 ip分配情况
#进入容器 测试即可 ping
创建子网段
docker network create --subnet=172.88.0.0/16 test-network
docker run -e TZ="Asia/Shanghai" \
--restart always \
--network dqnetwork \
--ip 172.88.0.10 \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 \
-d mysql:5.6.34
容器数据共享 volume
单一文件目录挂载
单一 容器挂载点 挂载的目录只对 一个容器生效
docker run --name 容器名 -v 宿主机路径:容器内部镜像路径 镜像名
docker run -d --name t1 -p 80:8080 --volume /webapps:/usr/local/tomcat/webapps test.com/my-tomcat:1.0
docker run -d --name t2 -p 81:8080 --volume /webapps:/usr/local/tomcat/webapps test.com/my-tomcat:1.0
# 修改挂载文件后,所有的容器 将都发生变化
自行build 镜像 ,固定目录
共享挂载点
# 每一个容器都写 挂载命令 ,太过于麻烦 使用共享挂载点的方式
'''
FROM tomcat:latest
# 设置基本镜像
MAINTAINER DJ
# 说明信息
WORKDIR /usr/local/tomcat/webapps
ADD docker-web ./doc-web
'''
docker build -t redorcasz.com\my-tomcat:latest ./
docker run -d --name t1 -p 81:8080 redorcasz.commy-tomcat
docker run -d --name t2 -p 82:8080 redorcasz.commy-tomcat
# 静态文件不能有变化 变化的话,还有重新 打包镜像 --- 不推荐
创建共享容器
'''
FROM tomcat:latest
# 设置基本镜像
MAINTAINER DJ
# 说明信息
RUN ["rm","-fr","/usr/local/tomcat/webapps"]
RUN ["mv","/usr/local/tomcat/webapps.dist","/usr/local/tomcat/webapps"]
'''
docker build -t test.com\my-tomcat:2.0 ./
docker create --name web-page -v /server/docker-web:/usr/local/tomcat/webapps/docker-web test.commy-tomcat:2.0 /bin/true
# 创建的web-page ,相当于做了一个软链接
# 至于为什么要加一个 /bin/true : 这个web-page 是不会启动的,加true只是为了给他一个入口点,保持模式完整性,显着你更加专业,当然你要是想着避免浪费资源的话,使用 tianon/true,开销更小。
docker run -d --name t1 --volumes-from web-page -p 81:8080 test.commy-tomcat:2.0
docker run -d --name t2 --volumes-from web-page -p 82:8080 test.commy-tomcat:2.0
# 现在随意修改 本地静态文件,即可达到修改所有的容器的静态文件
docker-compose
docker-compose安装
https://github.com/docker/compose/releases/tag/v2.6.0 # 下载二进制文件
curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋权
chmod +x /usr/local/bin/docker-compose
# 做软连接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 测试使用
docker-compose --version
容器集群 单机版 编排工具
docker 官方镜像
1、使用官方镜像 作为基础镜像 进行构建 自定义镜像
比如 MySQL 需要配置环境变量 用户 密码 空密码 还有初始化文件,构建镜像后,自动创建库和表
jdk 镜像 使用openjdk 构建镜像的时候,加入到jia包文件
python解释器设置解释器的版本 2和3 等等
公司自有业务一般需要对基础镜像加工,那么加工的时候要考虑一致性和便利性
2、
docker-compose.yml
yml 格式中,value值 和冒号之间必须有空格
yml 格式中,value值 是数字类型 使用单引号,其他类型不需要
------------------------- docker-conpose中自动构建镜像 部署服务---------------------------
version: '3.3'
# 标注 docker-compose的版本号
services:
# 分级的标识符 ,说明services下有资源,下面的key 使用2个空格和services进行显示上下级关系
db:
# db是服务名的意思,能代表容器资源 网络资源 文件资源
# 在理解的直白一点 ,你可以想象成 你容器的名字
build: ./sql
- contest: /server/dockerfile
# 宿主机的sql目录下的 dockerfile ,自动构建新的镜像
restsrt: unless-stopped
# 容器 启动方式
# 1、no,默认策略,在容器退出时不重启容器
# 2、on-failure,在容器非正常退出时(退出状态非0),才会重启容器
# 3、on-failure:3 在容器非正常退出时,重启容器,最多重启3次
# 4、always,在容器退出时总是重启容器,
# 5、unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。
environment:
# 环境变量的标识符
MYSQL_ROOT_PASSWORD: 123456
app:
# 容器的名称
build: ./app
depends_on:
# 依赖的关系 ,当前容器要能访问某谁 link 的意思
- db
# 指定容器名
ports:
# 容器的端口映射关系 类似于 -p 参数
- "80:80"
# 宿主机端口 和 容器的端口
restart: always
------------------------- docker-conpose中使用已经打包号的镜像 部署服务---------------------------
version: '3.3'
networks:
# 指定网络资源集合
test-net:
# 指定一个网桥的名字
external: false
# false 等于 在容器使用的时候再去创建。
# true 等于 必须先创建网桥的时候在运行docker-compose
services:
nginx-web01:
images:
- nginx:latest
networks:
- test-net
# 引用docker的网桥
container_name: web01
# 相当于 docker --name=web01
volumes:
# 挂载文件 可以多个值进行
- /server/conf:/etc/nignx/conf.d
volumes_from:
- webpage
# 引用其他容器的映射关系
command:
- ['ps','-ef']
# 容器启动后 执行的命令
dns: 8.8.8.8
# dns 设置
docker-compose 命令
docker-compose up
# 启动容器
# -d 后台运行
docker-compose down
# 关闭容器 并且 清楚容器
docker-compose logs
# 查看日志
浙公网安备 33010602011771号