Docker安装
操作系统:CentOS7
文档地址:https://docs.docker.com/engine/install/centos/
0、前置准备
# 安装gcc
yum -y install gcc
# 安装gcc-c++
yum -y install gcc-c++
1、卸载旧版本
如果主机上存在旧版本Docker 首先需要卸载
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、设置Docker stable 仓库
sudo yum install -y yum-utils
# 镜像仓库尽量选择国内的
# 阿里云 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 官方 https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 推荐执行一次 更新yum索引
yum makecache fast
3、安装Docker 引擎
# 安装最新版本Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 安装特定版本Docker
# 获取Docker版本 第二列为版本号
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
# 安装
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin
4、启动Docker
sudo systemctl start docker
5、启动容器
sudo docker run hello-world
6、卸载Docker
# 停止Docker
systemctl stop docker
# 移除Docker
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
镜像加速器配置
1、登录阿里云,进入 容器镜像服务/镜像加速器 获取加速器地址
https://tf71ojel.mirror.aliyuncs.com
2、配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tf71ojel.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
帮助启动类命令
# 停止docker
systemctl stop docker
# 启动docker
systemctl start docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机启动docker
systemctl enable docker
# 查看docker信息
docker info
# 查看总体帮助文档
docker --help
# 查看具体帮助文档
docker run --help
镜像命令
# 获取本地镜像
# -a 列出所有镜像
# -q 只显示镜像id
docker images
# 从远程仓库搜索镜像
# --limit 只列出多少个 默认25个
# docker search --limit 5 redis
docker search [image_name]
# 拉镜像至本地
# 指定版本 docker pull hello-world:latest,不指定就是最新版
docker pull hello-world
# 查看本地总体信息
docker system df
# 删除镜像
# docker rmi -f [image_id|image_name] 强制删除
# 删除多个 dokcer rmi -f [image_id1] [image_id2]
# 删除全部 docker rmi -f $(docker images -qa)
docker rmi [image_id|image_name]
容器命令
1、run
# 指定镜像名字
docker run ubuntu --name=[name]
# 后台运行容器并返回容器ID
docker run ubuntu -d
# -i 一以交互模式运行容器,通常与-t同时使用 interactive
# -t 为容器重新分配一个伪输入终端, 也即启动交互式容器 terminal
docker run ubunut -it
# -P 随机端口映射 -p [outPort]:[innerPort] 指定端口映射
docker run ubuntu -p 8080:80
# 退出容器
root@f83126e9804e:/# exit
exit
# 列出所有正在运行的容器实例
docker ps
2、ps
# -a 列出历史上所有运行过的容器
# -l 显示最近创建的容器
# -n 显示最近创建的n个容器
# -q 只显示容器Id
3、容器基本操作
# 退出容器
# exit 退出容器 容器会停止
# ctrl + p + q 容器不停止
# 启动已经停止的容器
docker start [id|name]
# 重启容器
docker restart [id|name]
# 停止容器
docker stop [id|name]
# 强制停止容器
docker kill [id|name]
# 删除容器
docker rm [id]
# 强制删除容器
docker rm -f [id]
# 强制删除所有容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docmer rm
4、重要
# 查看容器日志
docker logs [containerId]
# 查看容器内运行的进程
docker top [containerId]
# 查看容器内部细节
docker inspect [containerId]
# 进入容器
# exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
# attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出会导致容器的停止
docker exec -it [containerId] /bin/bash
docker attach -it [containerId] /bin/bash
5、文件命令
# 从容器拷贝文件至物理机
docker cp [containerId]:[containerPath] [localPath]
# 导出容器内容作为一个tar归档文件
docker export [containerId] > [tarName].tar
# 导入归档文件
# cat 文件名.tar | docker import -镜像用户/镜像名: 镜像版本号
# 镜像用户相当于一个包名,无所谓,随便给一个名字就行,不能和本地镜像库中的镜像重复
cat [tarName].tar | docker import -[imageUser]/[imageName]:[imageVersion]
6、命令总结

常用:
#info|version
docker info #显示docker的系统信息,包括镜像和容器的数量
docker version #显示docker的版本信息。
#帮助命令
docker 命令 --help #帮助命令
#镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search #搜索镜像
docker pull #下载镜像 docker image pull
docker rmi #删除镜像 docker image rm
#容器命令
docker run 镜像id #新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id #删除指定容器
#删除所有容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
#启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作
#其他常用命令
docker run -d 镜像名 #后台启动命令
docker logs #查看日志
docker top 容器id #查看容器中进程信息ps
docker inspect 容器id #查看镜像的元数据
docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker attach # 进入容器正在执行的终端
docker cp 容器id:容器内路径 主机目的路径 #从容器内拷贝到主机上
docker attach #连接到正在运行中的容器
docker build #使用 Dockerfile 创建镜像
docker builder #管理builds
docker builder prune #清除build缓存
docker checkpoint #管理checkpoints
docker checkpoint create #从正在运行的容器创建检查点
docker checkpoint ls #列出容器的检查点
docker checkpoint rm #删除指定的检查点
docker commit #从容器创建一个新的镜像
docker config #管理Docker配置
docker config create #创建配置文件
docker config inspect #查看配置文件信息
docker config ls #显示docker里已经保存得配置文件
docker config rm #删除配置文件
docker container #管理容器
docker container prune #删除所有已停止的容器
docker context #管理contexts
docker context create #创建一个上下文
docker context export #将上下文导出到tar或kubecconfig文件中
docker context import #从tar或zip文件导入上下文
docker context inspect #在一个或多个上下文上显示详细信息
docker context ls #列出上下文
docker context rm #删除一个或多个上下文
docker context update #更新
docker context use #设置当前docker的上下文
docker cp #用于容器与主机之间的数据拷贝
docker create #创建一个新的容器但不启动它
docker diff #检查容器里文件结构的更改
docker events #从服务器获取实时事件
docker exec #在运行的容器中执行命令
docker export #将文件系统作为一个tar归档文件导出到STDOUT
docker history #查看指定镜像的创建历史
docker image #管理镜像
docker image inspect #显示一个或多个镜像的元数据
docker image ls #列出本地镜像
docker image prune #删除没有使用的镜像
docker image rm #删除一个或多个镜像
docker images #列出本地镜像
docker import #从归档文件中创建镜像
docker info #显示 Docker 系统信息,包括镜像和容器数
docker inspect #获取容器/镜像的元数据
docker kill #杀掉一个运行中的容器
docker load #导入使用 docker save 命令导出的镜像
docker login #登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout #登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logs #获取容器的日志
docker manifest #管理manifest(实验,不应用于生产环境)
docker manifest annotate #向本地镜像清单添加附加信息
docker manifest create #创建用于注释和推入注册表的本地清单列表
docker manifest inspect #显示镜像清单或清单列表
docker manifest push #将清单列表推入仓库
docker manifest rm #从本地存储中删除一个或多个清单列表
docker network #管理网络
docker network connect #将容器连接到网络
docker network create #创建一个网络
docker network disconnect #断开容器的网络
docker network inspect #显示一个或多个网络的元数据
docker network ls #列出网络
docker network prune #删除所有没有使用的网络
docker network rm #删除一个或多个网络
docker node #管理集群(swarm)节点
docker node demote #从群集(swarm)管理器中降级一个或多个节点
docker node inspect #显示一个或多个节点的元数据
docker node ls #列出群集(swarm)中的节点
docker node promote #将一个或多个节点推入到群集管理器中
docker node ps #列出在一个或多个节点上运行的任务,默认为当前节点
docker node rm #从群集(swarm)删除一个或多个节点
docker node update #更新一个节点
docker pause #暂停容器中所有的进程
docker plugin #管理插件
docker plugin create #从rootfs和配置创建一个插件。插件数据目录必须包含config.json和rootfs目录。
docker plugin disable #禁用插件
docker plugin enable #启用插件
docker plugin inspect #显示一个或多个插件的元数据
docker plugin install #安装一个插件
docker plugin ls #列出所有插件
docker plugin push #将插件推送到注册表
docker plugin rm #删除一个或多个插件
docker plugin set #更改插件的设置
docker plugin upgrade #升级现有插件
docker port #列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
docker ps #列出容器
docker pull #从镜像仓库中拉取或者更新指定镜像
docker push #将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker rename #重命名容器
docker restart #重启容器
docker rm #删除一个或多个容器
docker rmi #删除一个或多个镜像
docker run #创建一个新的容器并运行一个命令
docker save #将指定镜像保存成 tar 归档文件
docker search #从Docker Hub查找镜像
docker secret #管理Docker secrets
docker secret create #从文件或STDIN创建一个秘密作为内容
docker secret inspect #显示有关一个或多个秘密的详细信息
docker secret ls #列出秘密
docker secret rm #删除一个或多个秘密
docker service #管理服务
docker service create #创建一个服务
docker service inspect #查看服务的元数据
docker service logs #获取服务的日志
docker service ls #列出服务
docker service ps #列出一个或多个服务的任务
docker service rm #删除一个或多个服务
docker service rollback #将更改恢复到服务的配置
docker service scale #缩放一个或多个复制服务
docker service update #更新服务
docker stack #管理堆栈
docker stack deploy #部署新的堆栈或更新现有堆栈
docker stack ls #列出现有堆栈
docker stack ps #列出堆栈中的任务
docker stack rm #删除堆栈
docker stack services #列出堆栈中的服务
docker start #启动一个或多个已经被停止的容器
docker stats #显示容器的实时流资源使用统计信息
docker stop #停止一个运行中的容器
docker swarm #管理集群(Swarm)
docker swarm ca #查看或旋转当前群集CA证书。此命令必须针对管理器节点
docker swarm init #初始化一个群集(Swarm)
docker swarm join #加入群集作为节点和/或管理器
docker swarm join-token #管理加入令牌
docker swarm leave #离开群集(Swarm)
docker swarm unlock #解锁群集(Swarm)
docker swarm unlock-key #管理解锁钥匙
docker swarm update #更新群集(Swarm)
docker system #管理Docker
docker system df #显示docker磁盘使用情况
docker system events #从服务器获取实时事件
docker system info #显示系统范围的信息
docker system prune #删除未使用的数据
docker tag #标记本地镜像,将其归入某一仓库
docker top #查看容器中运行的进程信息,支持 ps 命令参数
docker trust #管理Docker镜像的信任
docker trust inspect #返回有关key和签名的低级信息
docker trust key #管理登入Docker镜像的keys
docker trust key generate #生成并加载签名密钥对
docker trust key load #加载私钥文件以进行签名
docker trust revoke #删除对镜像的认证
docker trust sign #镜像签名
docker trust signer #管理可以登录Docker镜像的实体
docker trust signer add #新增一个签名者
docker trust signer remove #删除一个签名者
docker unpause #恢复容器中所有的进程
docker update #更新一个或多个容器的配置
docker version #显示 Docker 版本信息
docker volume #管理volumes
docker volume create #创建一个卷
docker volume inspect #显示一个或多个卷的元数据
docker volume ls #列出卷
docker volume prune #删除所有未使用的卷
docker volume rm #删除一个或多个卷
docker wait #阻塞运行直到容器停止,然后打印出它的退出代码
Docker镜像
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。Docker镜像是分层的,pull 镜像时时一层一层的下载
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
Docker commit命令
# 提交命令
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[标签名]
案例:ubuntu安装vim并生成新镜像
# 以下容器内执行
# 更新包管理工具
apt-get update
# 安装vim
apt-get -y install vim
# 以下容器外执行
[root@hadoop100 ~]# docker commit -m="add vim tool" -a="code9xs" 67ea124ae9d8 ubuntu_vim:1.0.0
sha256:12307dacbba4b436e3c78cc42570dcd1e626817ed2460d612bb29d3b4c20bfbb
[root@hadoop100 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_vim 1.0.0 12307dacbba4 11 seconds ago 180MB
ubuntu latest ba6acccedd29 12 months ago 72.8MB
hello-world latest feb5d9fea6a5 13 months ago 13.3kB
redis 6.0.8 16ecd2772934 2 years ago 104MB
[root@hadoop100 ~]#
Docker 镜像发布到阿里云(私有库)
镜像生成方法
1、使用commit命令生成一个本地镜像
2、DockerFile
3、
发布至阿里云
1、进入阿里云控制台
2、创建命名空间
3、创建镜像仓库
阿里云操作指南
获取方法:
指南:
#1. 登录阿里云Docker Registry
$ docker login --username=[username] registry.cn-hangzhou.aliyuncs.com
#用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
#您可以在访问凭证页面修改凭证密码。
#2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/[nameSpace]/[registryName]:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=[username] registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/[nameSpace]/[registryName]:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/[nameSpace]/[registryName]:[镜像版本号]
# 请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
#4. 选择合适的镜像仓库地址
#从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
#如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
#5. 示例
#使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
#使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
操作步骤
# 服务器docker 登录至阿里云,此处密码是 容器服务中 访问凭证中设置的固定密码
[root@hadoop100 ~]# docker login --username=[usernmae] registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@hadoop100 ~]# docker tag 12307dacbba4 registry.cn-hangzhou.aliyuncs.com/code9xs/ubuntu_vim:1.0.0 [root@hadoop100 ~]# docker push registry.cn-hangzhou.aliyuncs.com/code9xs/ubuntu_vim:1.0.0 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/code9xs/ubuntu_vim]
98c1056c11cd: Pushed
9f54eef41275: Pushed
1.0.0: digest: sha256:f428c060e09bfa7ac128f24f8cd1766460c9d151d3c2457cd9c59918161ae82c size: 741
私有云简介
Docker Registry 搭建
# 下载 registry
[root@hadoop100 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete
0d96da54f60b: Pull complete
5b27040df4a2: Pull complete
e2ead8259a04: Pull complete
3790aef225b9: Pull complete
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
# 指定容器数据卷 运行
[root@hadoop100 home]# docker run -d -p 5000:5000 -v /home/code9xs/:/tmp/registry --privileged=true registry
# curl 验证私服库上有什么镜像
[root@hadoop100 ~]# curl -XGET http://192.168.111.162:5000/v2/_catalog
# 将新镜像修改符合私服规范的Tag
#按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag
[root@hadoop100 ~]# docker tag ubuntu_vim:1.0.0 192.168.122.1:5000/ubuntu_vim:1.0.0
# 修改配置文件使之支持http
[root@hadoop100 ~]# vim /etc/docker/daemon.json
#{
# "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],
# 新增registry地址
# "insecure-registries": ["192.168.111.162:5000"]
#}
# push 推送到私服
[root@hadoop100 ~]# docker push 192.168.122.1:5000/ubuntu_vim:1.0.0
[root@hadoop100 ~]# curl -XGET http://192.168.111.162:5000/v2/_catalog
# 从私有库上pull镜像
[root@hadoop100 ~]# docker pull 192.168.122.1:5000/ubuntu_vim:1.0.0
容器数据卷
指定容器数据卷时记得 加入 --privileged=true ,不然访问目录时可能出现 cannot open directory .: Permission denied
容器数据卷挂载命令:
docker run -d -p 5000:5000 -v /home/test:/tmp/test -privileged=true ubuntu
# docker run -d -p [宿主机端口]:[容器内端口] -v [宿主机目录]:[容器内目录] -privileged=true [镜像]:[标签]
# 容器卷挂载时 默认是可读可写的 相当于下面的命令
docker run -d -p 5000:5000 -v /home/test:/tmp/test:rw -privileged=true ubuntu
# 想要容器目录只可读
docker run -d -p 5000:5000 -v /home/test:/tmp/test:ro -privileged=true ubuntu
作用:容器和宿主机之间的数据共享
# 查看数据卷是否挂载成功
docker inspect [容器ID]
...
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/host_data",
"Destination": "/tmp/docker_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
容器卷之间的继承:
# docer run -it --privileged=true -volumes-from 父类 --name 容器名 镜像名
docer run -it --privileged=true -volumes-from u1 --name u2 ubuntu
# 此时u2 继承了 u1 配置的容器卷,u2 容器内外的挂载目录都和u1 一样 数据也是共享的
常用软件安装
1、Tomcat
- docker pull tomcat
- docker run -d -p 8080:8080 tomcat
- docker exec -it [镜像ID] /bin/bash
- rm -rf webapps(注 步骤4和5只针对tomcat10版本,低版本不需要这一步)
- mv webapps.dist webapps
- 访问宿主机8080端口即可
2、Mysql
-
docker pull mysql:5.7
-
挂载mysql 日志文件、数据文件、配置文件目录到宿主机
docker run -d -p 3306:3306 --privileged=true -v /var/mysql/log:/var/log/mysql -v /var/mysql/data:/var/lib/mysql -v /var/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7 -
修改配置文件,在mysql配置文件宿主机挂载目录新建 my.cnf,插入如下后保存退出 ``
[client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8 -
docker restart [容器ID]
-
docker exec -it [容器ID] /bin/bash
-
容器内执行 mysql -uroot -p (输入密码root)
-
mysql> show variables like 'character%';(查看字符集),字符集正确后为完成
2、Redis
- docker pull redis:6.0.8
- 创建redis本地目录存放配置文件和数据文件(目录随意)
mkdir -p /app/redis - 将准备好的redis.conf文件放进/app/redis目录下 ,配置文件可以到安装过redis的服务器下拷贝,也可上网搜索,修改自己的配置文件,修改条目如下:
- 开启redis验证 可选,——> requirepass 123
- 允许redis外地连接 ----->注释 # bind 127.0.0.1
- 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败 -----> daemonize no
- 开启redis数据持久化 appendonly yes 可选 -----> appendonly yes
- docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
- docker exec -it [容器ID] /bin/bash
- 测试redis
Mysql 主从复制
1、新建主服务器容器实例3307
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
2、添加主服务器容器配置文件
# vim /mydata/mysql-master/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
3、重启主服务器
4、master 容器实例内创建数据同步用户
create user 'slave'@'%' identified by '123456';
grant replication slave, relication client on *.* to 'slave'@'%';
5、新建从服务器容器实例3307
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
6、添加从服务器容器配置文件
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
7、重启从服务器容器实例
8、在主数据库中查看主从同步状态 获取position
mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 | 617 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
9、在从数据库中配置主从复制
change master to master_host='192.168.122.1', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
10、在从数据库中查看主从同步状态
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.122.1
Master_User: slave
Master_Port: 3307
Connect_Retry: 30
Master_Log_File: mall-mysql-bin.000001
Read_Master_Log_Pos: 617
Relay_Log_File: mall-mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mall-mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 617
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified
# 此时还未同步
# Slave_IO_Running: No
# Slave_SQL_Running: No
11、在从数据库中开启主从同步
start slave;
12、再次检查主从同步状态
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.122.1
Master_User: slave
Master_Port: 3307
Connect_Retry: 30
Master_Log_File: mall-mysql-bin.000001
Read_Master_Log_Pos: 617
Relay_Log_File: mall-mysql-relay-bin.000002
Relay_Log_Pos: 325
Relay_Master_Log_File: mall-mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 617
Relay_Log_Space: 537
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 101
Master_UUID: b1e966d2-60ee-11ed-a311-0242ac110002
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified
# 此时已同步
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes
DockerFile
保留字整理
FROM: 基础镜像,当前新镜像是基于那个镜像的,制定一个已经存在的镜像作为模板,第一条必须是FROM
MAINTAINER: 镜像维护者的姓名和邮箱地址
RUN: 容器构建时需要运行的命令,支持shell和exec格式,RUN是在docker build是运行
EXPOSE: 当前容器对外暴露出的端口
WORKDIR: 制定容器后终端默认登陆进来的工作目录
USER: 制定镜像以什么样的用户去执行,如果不指定,默认是root,一般不会使用这个参数
ENV: 用来在构建镜像过程中设置环境变量
ADD: 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY: 类似ADD,拷贝文件和目录到镜像中。COPY src dest/COPY ["src", "dest"],镜像内无需事先建立路径,命令会自动创建
VOLUME: 容器数据卷,用于数据保存和持久化工作
CMD: 指定容器启动后要干的事情,DockerFile中可以有多个CMD指令,但只有最后一个生效, CMD会背docker run之后的参数替换,CMD 是在docker run 是运行的
ENTERPOINT:也是用来制定容器启动时要运行的命令,类似于CMD指令,但是ENTERPOINT不会被docker run 后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTERPOINT指令指定的程序
DockerFile 实践
构建命令: docker build -t centosjava8:1.5 .
docker build -t [镜像名]:标签 [Dockerfile文件位置]
jdk下载: https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
docker警告:WARNING: IPv4 forwarding is disabled. Networking will not work. 当在 build时出现这个警告说明容器内没有网络,需要修改宿主机的vim /etc/sysctl.conf 文件 添加 net.ipv4.ip_forward=1 再重启network和docker服务,systemctl restart network && systemctl restart docker,查看是否修改成功 sysctl net.ipv4.ip_forward,再次使用就能正常访问外网
Dockerfile 文件实例
如果build失败 直接用镜像创建容器去手动执行RUN 后面的命令,找原因
FROM centos:7
# 下面几行是配置阿里云yum源使用的,默认是CentOS自带的yum源 下载比较慢
RUN rm -rf /etc/yum.repo.d/*
COPY docker-ce.repo /etc/yum.repo.d
RUN yum clean all && yum makecache
RUN yum -y update
MAINTAINER code9xs<i9xswanan@gmail.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
删除虚悬镜像
查看 docker images ls -f dangling=true
删除 docker image prune
微服务实战
打包微服务jar包并通过docker运行
将微服务jar包与Dockerfile文件放在同一目录下
jar包名为:docker_boot-0.0.1-SNAPSHOT.jar
编写DockerFile文件
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
运行打包好的docker镜像: docker run -d -p 6001:6001 6bde8af1f34c
Docker 网络
基本命令
[root@hadoop100 mydocker]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
查看网络 docker network ls
创建网络 docker network create 网络名
删除网络 docker network rm 网络名
五种网络类型
bridge
相当于在宿主机上建立了一个虚拟的交换机,每一个容器都被分配了一个ip
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
host
容器的ip信息和主机相同
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
none
禁用了容器的网络功能
在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo
需要我们自己为Docker容器添加网卡、配置IP等
container
借用其他容器的网络,网络信息和被借用容器相同
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
自定义网络
在同一自定义网络下的容器可以通过ping容器名和其它容器获得连接,容器名是不会改变的,但是ip地址是有可能改变的,同时部署多个微服务就可能出现ip错误,无法正确访问微服务的情况,所以自定义网络可以ping通服务名
# 创建自定义网络
[root@hadoop100 mydocker]# docker network create shd_network
447a1c65939902b8c3d73cd02377d3ed6d669397cb2d82d639565f6e0e0bcb41
[root@hadoop100 mydocker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8737969c7f1f bridge bridge local
bb9ec94e0a53 host host local
e4fd32be19ca none null local
447a1c659399 shd_network bridge local
# 以自定义网络启动容器
[root@hadoop100 mydocker]# docker run -d --network shd_network --name docker_boot -p 6001:6001 zzyy_docker:1.6
b3274b5ae27de88a29fc43a1ade4fc8397fe3409d25ade8f0d901a8c90a7074e
[root@hadoop100 mydocker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3274b5ae27d zzyy_docker:1.6 "java -jar /zzyy_doc…" 4 seconds ago Up 3 seconds 0.0.0.0:6001->6001/tcp, :::6001->6001/tcp docker_boot
Docker-compose 容器编排
docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?
如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具
例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
文档地址:https://docs.docker.com/compose/compose-file/compose-file-v3/
安装:https://docs.docker.com/compose/install/other/
docker-compose install
[root@hadoop100 mydocker]# curl -SL https://github.com/docker/compose/releases/download/v2.16.0/dodocker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 45.4M 100 45.4M 0 0 19020 0 0:41:48 0:41:48 --:--:-- 17487
[root@hadoop100 mydocker]# ll
总用量 19064
-rw-r--r--. 1 root root 19514570 2月 11 15:22 docker_boot-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 root root 472 2月 11 15:26 Dockerfile
[root@hadoop100 mydocker]# cd ..
[root@hadoop100 home]# chmod +x /usr/local/bin/docker-compose
[root@hadoop100 home]# docker-compose --version
Docker Compose version v2.16.0
docker-compose uninstall
rm /usr/local/bin/docker-compose
todo 容器编排先不看了
浙公网安备 33010602011771号