docker简单使用
- 简单介绍
- 一. docker 简介 ---docker 初使用
- 二。安装 docker
- docker 容器的基本操作
- 在容器中部署静态网站
- 练习:
- 查看和删除镜像:
- 查看镜像
- 删除镜像
- 根据镜像仓库和标签只能删除一个
- docker 批量删除容器、镜像
- 获取和推送镜像
- 拉取镜像
- 配置 Docker 镜像站
- 开始推送镜像到 dockerhub 上
- docker 守护进程的配置和操作
- 查看守护进程
- RUN <command> (shell 模式)
- EXPOSE 指定运行该镜像的容器使用的端口
- run 和 cmd 区别
- 向容器中添加卷
- 设置环境变量
- 镜像触发器
- dockerfile 构建过程
- docker 容器的网络连接 以下得在 linux 运行
- OSI 七层模型中的网桥
- 自定义虚拟网桥
- docker 容器的互联
- docker 容器的数据管理
- 设置为加载卷只读
- 使用 dockerfile 构建包含数据卷的镜像
- docker 的数据卷容器
- docker 数据卷的备份和还原
- docker 跨主机连接
- 2. 使用 open vswitch 实现跨主机容器连接
- 3. 使用 weave 实现跨主机容器连接
- dockerfile 外部 jdk 和 tomcat 示例
- 使用 Docker 快速搭建 Mysql,并进行数据卷分离
- Dockerfile
- docker-compose
简单介绍
声明: 我用的是 mac,以下不做说明一般都是在 mac 上做的操作。
一. docker 简介 —docker 初使用
Docker 查看版本
docker version
docker 查找 tutorial 镜像
docker search tutorial
下载仓库镜像到本地
docker pull learn/tutorial
运行镜像
docker run learn/tutorial echo ‘hello world’
向 learn/tutorial 容器中安装 ping 命令
docker run learn/tutorial apt-get install -y ping
docker ps -l
提交镜像,相当于新创建了个镜像 learn/ping 是起的名字
docker commit id号 learn/ping
用新镜像运行个容器
docker run learn/ping ping www.baidu.com
查看当前运行的容器
docker ps
查看运行中的容器
docker inspect 容器id
查看有哪些镜像
docker images
将新创建的镜像保存到 github 中
push命令保存镜像到github上
docker push learn/ping
注意:
1. docker images命令可以列出所有安装过的镜像。
2. docker push命令可以将某一个镜像发布到官方网站。
3. 你只能将镜像发布到自己的空间下面。这个模拟器登录的是learn帐号。
二。安装 docker
Ubuntu 14.04 安装 docker
查看内核版本
uname -a
\2. 检查 Device Mapper
ls -l /sys/class/misc/device-mapper
依赖关系:
Ubuntu 14.04版本无需安装额外的依赖包,可以直接安装。
安装步骤:
使用管理员帐号登录ubuntu 14.04系统,保证该管理有root权限,或者可以执行sudo命令。
检查curl包有没有安装。
$ which curl
如果curl没有安装的话,更新apt源之后,安装curl包。
$ sudo apt-get update
$ sudo apt-get install curl
获得最新的docker安装包。
$ curl -sSL https://get.docker.com/ | sh
shell会提示你输入sudo的密码,然后开始执行安装过程。
确认 Docker 是否安装成功。
这个命令会下载一个测试用的镜像并启动一个容器运行它。
$ sudo docker run hello-world
额外补充:
使用非root用户启动docker
1.sudo groupadd docker
2.sudo gpasswd -a ${USER} docker
3.sudo service docker restart
需要注销docker再重新登录下docker才能生效
不用sudo验证
docker version
在 windos 中安装 docker
http://www.docker.org.cn/book/
在 mac os 下安装 docker
去docker官网下载dmg文件,注册自己的dockerhub账号登录,
查看 docker 版本
docker version
用 ubuntu 镜像输出 hello world 如果没有 ubuntu 镜像,docker 会默认给下载个最新的 ubuntu 镜像
docker run ubuntu echo 'hello world'
以交互式运行
docker run -i -t ubuntu /bin/bash #
-i --interactive=ture|false 默认是false 始终打开标准输入
-t --tty=true|false 默认是false 为docker分配个伪tty终端
这样新创建的容器才能提供个交互式的shell
在 ubuntu 容器中就和在 ubuntu 服务器一样 执行 ps -ef 测试 exit 退出
docker 容器的基本操作
docker ps [-a][-l]
-a表示列出所有创建的容器
-l 表示列出最新创建的容器
查看指定容器详细配置信息
docker inspect [id或者名字]
自定义容器名
docker run --name=自定义名 -i -t IMAGE /bin/bash
重新启动和停止容器:
docker start [-i] 容器名
删除停止的容器:(不能删除正在运行的容器)
docker rm 容器名
守护式容器: 什么是守护式容器: 能够长期运行 没有交互式会话 适合运行应用程序和服务
docker run --name=自定义名 -i -t IMAGE /bin/bash
Ctrl+P Ctrl+Q组合键退出容器
这样会以后台运行
附加到运行中的容器:
docker attach 容器名
执行 exit 看到容器停止了
守护式容器
启动守护式容器:
docker run -d 镜像名[COMMAND][ARG...]
docker run --name dc1 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看容器日志:
docker logs [-f][-t][--tail] 容器名
-f --follows=true|false 默认为false 一直跟踪日志的变化并返回结果
-t --timestamps=true|false 默认为false 返回的结果上加上时间戳
--tail="all" 返回结尾处多少数量的日志
不指定返回 logs 所有的日志
-tf 一直跟新,按 Ctrl+c 停止
–tail 10 最近十条
-tail 0 最近的一条
查看容器内进程:
docker top 容器名
在运行的容器内启动新进程:
docker exec [-d][-i][-t] 容器名 [COMMAND][ARG...]
24120 是我们在容器中加进去的进程
停止守护式容器:
docker stop 容器名
docker kill 容器名
在容器中部署静态网站
设置容器的端口映射
run [-P][-p]
-P, --publish-all=true|false 默认为false #为容器暴露的所有端口映射
docker run -P -i -t ubuntu /bin/bash
-p, --publish=[] #可以指定映射哪些容器的端口
小写的p有四种格式
containerPort #只指定容器的端口,宿主机的端口随机映射
docker run -p 80 -i -t ubuntu /bin/bash
hostPort:containerPort #容器和宿主机的端口都指定
docker run -p 8080:80 -i -t ubuntu /bin/bash
ip::containerPort
docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
ip:hostPort:containerPort
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
Nginx 部署流程
创建映射 80 端口的交互式容器
docker run -p 80 --name web -i -t ubuntu /bin/bash
安装 nginx
apt-get update apt-get install -y nginx
安装文本编辑器 vim
apt-get install -y vim
创建静态页面
mkdir -p /var/www/html cd /var/www/html vim index.html
<html> <head> <title>Nginx in Docker</title> </head> <body> <h1>Hello, I`m website in Docker!</h1> </body> </html>
修改 nginx 配置文件
whereis nginx #查找nginx的位置
打开 nginx 的配置文件
vim /etc/nginx/sites-enabled/default #root指定到自己创建的静态文件目录,如果一致就不用修改了。
运行 nginx
cd / nginx
Ctrl+P+Q 退出,让容器在后台运行。
验证网站访问
curl http://127.0.0.1:32768
或者在浏览器输入
练习:
停止 web 容器
启动 web 容器
Ctrl+P+Q 让容器后台运行。
启动 web 容器中 nginx 服务
查看 web 容器配置
查看和删除镜像:
列出镜像
镜像标签和仓库
查看镜像
删除镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
-a, --all=false #显示所有镜像,默认不显示中间层的镜像
--digests #显示摘要
-f, --filter=[] 过滤条件
--format string 使用Go模板打印漂亮的图像
--no-trunc=false 指定不使用截断的形式显示镜像的id
-q, --quiet=false 只显示镜像的id
可以为相同的镜像打上不同的标签
docker images --no-trunc
docker images -a
docker images -q
docker images ubuntu
查看镜像
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
-f, --format=” ”
删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
Options:
-f, --force=false 强制删除图像
--no-prune=false 会保留未打标签的父镜像
docker rmi ubuntu:latest
根据镜像仓库和标签只能删除一个
docker rmi 4e5021d210f6
#根据镜像id能删除多个
在运行的无法删除必须指定
删除多个
docker rmi ubuntu:latest admin:1.0.0
删除ubuntu中所有镜像
docker rmi $(docker images -q ubuntu)
docker 批量删除容器、镜像
1、删除所有容器
docker rm -f `docker ps -a -q`
2、删除所有镜像
docker rmi -f `docker images -q`
3、按条件删除镜像
//镜像名包含关键字 其中none为关键字
$ docker rmi -f $(docker images -q | grep "none" | awk '{print $3}')
停止容器
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')
按条件删除容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')
获取和推送镜像
docker search [OPTIONS] TERM
-f, --filter filter 过滤条件
--limit int 默认最大查25条
--no-trunc 显示全id
docker search --filter=stars=4 ubuntu
docker search --limit 4 ubuntu
拉取镜像
docker pull ubuntu:14.04
\2. 使用 --registry-mirror 选项
如果之前没用过,最好把自己的镜像上传到 dockerhub 或者私有部署上,这样设置完有可能会更新 docker 导致你的镜像和容器丢失。
https://www.daocloud.io
https://www.daocloud.io/mirror
配置 Docker 镜像站
Linux
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件
/etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。更多详情请访问文档。
macOS
Docker For Mac
右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中
加入下面的镜像地址:
http://f1361db2.m.daocloud.io
点击 Apply & Restart 按钮使设置生效。
Docker Toolbox 等配置方法请参考帮助文档。
- Windows
Docker For Windows
在桌面右下角状态栏中右键 docker 图标,修改在 Docker Daemon 标签页中的 json ,把下面的地址:
http://f1361db2.m.daocloud.io
加到" registry-mirrors"的数组里。点击 Apply 。
mac 上遇到的问题:
当你重新下载镜像测试的时候可能报错,这个时候你需要重启reset factory,启动docker 的时候点击第一个按钮
dawn-2:~ root# docker pull ubuntu:12.10
Error response from daemon: Bad response from Docker engine
重新登录dockerhub就可以了
注意:登录上去我之前的本地镜像都没了。呵呵
这个是我用的中国科技大学的国内镜像
https://docker.mirrors.ustc.edu.cn
开始推送镜像到 dockerhub 上
推送镜像的规范是:
- docker push 注册用户名 / 镜像名
tag 命令修改为规范的镜像:
docker tag ubuntu:12.10 hexiaoming/ubuntu
docker login
输入dockerhub用户名
输入dockerhub密码 #mac提示
你没有找到xxx的秘钥串,这个时候点击
还原默认值
输入dockerhub的密码看到shell 页面Login Succeeded登录成功了
这个时候可以上传了
docker push hexiaoming/ubuntu
看 dockerhub 已经上传上去镜像,dockerhub 上私有仓库只能有一个
使用 commit 构建镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] -a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") -c, --change list Apply Dockerfile instruction to the created image -m, --message string Commit message -p, --pause Pause container during commit (default true)
启动个交互式容器
docker run -it -p 80 --name commit_test ubuntu /bin/bash apt-get update apt-get install -y nginx exit
把容器提交为镜像
docker commit -a 'hexiaoming' commit_test hexiaoming/commit_test1 docker images
用镜像运行个容器(容器启动时运行 nginx 命令,已后台运行 - d)
docker run -d --name nginx_web2 -p 80 hexiaoming/commit_test1 nginx -g "deamon off;" curl http://127.0.0.1:8080验证
使用 dockerfile 构建镜像
创建dockerfile 使用docker build命令 #First Dockerfile FROM ubuntu:14.04 #镜像的基础 MAINTAINER hexiaoming "17710146600@163.com" #镜像的维护人 RUN apt-get update #执行的命令 RUN apt-get install -y nginx EXPOSE 80 #暴露的端口
docker build 参数
docker build [OPTIONS] PATH | URL | -
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Dockerfile的名称(默认为“PATH/Dockerfile”)
--force-rm 始终移除中间容器,默认为false
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--network string Set the networking mode for the RUN instructions during build (default "default")
--no-cache 生成图像时不要使用缓存 ,默认为false
--pull 总是尝试提取较新版本的镜像,默认为false
-q, --quiet 成功时抑制生成输出并打印图像ID默认为false
--rm 成功生成后删除中间容器(默认为true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list 给镜像取个名字
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
正确的 dockerfile 格式
#First Dockerfile
FROM ubuntu:14.04
#镜像的维护人
MAINTAINER hexiaoming "17710146600@163.com"
RUN apt-get update
RUN apt-get install -y nginx
#暴露的端口
EXPOSE 80
查看镜像
docker images
运行镜像
docker run -d --name nginx_web3 -p 80 hexiaoming/df_test1 nginx -g "deamon off;"
注释:run 后加 - g “deamon off;” 的原因:
容器启动时执行的那条入口命令一旦结束了,容器也会结束。如果启动命令单纯是以后台守护 (daemon) 模式启动 nginx,那么启动命令会立即结束,容器也会立即结束。
其实只要在任何命令之后加一句 && cat,就会让这条命令卡在前台而不会结束,不是非得用 daemon off
docker 本地访问
Remote API 没有了可以用 engine/api/ https://docs.docker.com/engine/api/
原文:
Docker provides an API for interacting with the Docker daemon (called the Docker Engine API), as well as SDKs for Go and Python. The SDKs allow you to build and scale Docker apps and solutions quickly and easily. If Go or Python don’t work for you, you can use the Docker Engine API directly.
翻译:
Docker 提供了一个用于与 Docker 守护进程进行交互的 API(称为 Docker Engine API),以及 Go 和 Python 的 SDK。使用 SDK,您可以快速轻松地构建和扩展 Docker 应用程序和解决方案。如果 Go 或 Python 不适用于您,则可以直接使用 Docker Engine API。
运行过 Docker Hub 的 Docker 镜像的话,会发现其中一些容器时需要挂载 /var/run/docker.sock 文件。这个文件是什么呢?为什么有些容器需要使用它?简单地说,它是 Docker 守护进程 (Docker daemon) 默认监听的 Unix 域套接字 (Unix domain socket),容器中的进程可以通过它与 Docker 守护进程进行通信。
我的 docker engineAPI 版本
官方文档
https://docs.docker.com/engine/api/sdk/examples/
测试
curl --unix-socket /var/run/docker.sock http:/v1.24/images/json
http 例子可以继续参考这个。
https://docs.docker.com/engine/api/v1.40/#
第三方的库,用于代码方式链接 docker
https://docs.docker.com/engine/api/sdk/
docker 守护进程的配置和操作
查看守护进程
ps -ef | grep docker
linux 上使用启动 docker 查看 docker 状态
sudo status docker不行就用
systemctl status docker不行就用
sysvinit status docker
sudo service docker stop
sudo service docker start
sudo service docker restart
FROM #镜像的基础 已经存在的镜像,基础镜像,必须是第一条非注释指令
MAINTAINER #镜像的维护人
RUN指定当前镜像中运行的命令
#执行的命令 因为镜像分层,下个run指令会在当前镜像创建个新镜像运行当前的命令,
如果把两个run命令用&&连接起来会减少重复构建镜像。其实都差不多,docker是集装箱一样增量构建。
RUN (shell 模式)
/bin/sh -c command
RUN echo hello
RUN ["executable","param1","param2"](exec模式)
RUN ["/bin/bash","-c","echo hello"]
EXPOSE 指定运行该镜像的容器使用的端口
EXPOSE <port>[<port>...]
但是处于安全考虑docker容器并不会自动打开端口,需要我们手动去指定打开端口。
CMD ["executable","param1","param2"](exec模式)
CMD command param1 param2 (shell模式)
CMD ["param1","param2"](作为ENTRYPOINT指令的默认参数)
run 和 cmd 区别
run是在镜像构建过程中运行的,cmd是在容器运行时运行的
如果用docker run 启动一个容器制定了容器运行时命令,cmd中的指令会被覆盖不会执行。
示例
之前的运行容器命令
docker run -d --name nginx_web3 -p 80 hexiaoming/df_test1 nginx -g "deamon off;"
如果 dockerfile 中加了 CMD [“/usr/sbin/nginx”,“-g” ,“deamon off;”] 这里就可以去掉 nginx -g “deamon off;” 写为
docker run -d --name nginx_web3 -p 80 -d hexiaoming/df_test1
如果这里 run 指定了 cmd 命令会覆盖调 dockerfile 中的 cmd 命令
docker run -d --name cmd_test2 -p 80 hexiaoming/df_test1 /bin/bash
ENTRYPOINT["excutable","param1","param2"](exec模式)
ENTRYPOINT command param1 param2 (shell模式)
唯一和cmd区别就是ENTRYPOINT 不会被启动命令所覆盖,
如果需要覆盖可以使用docker run --entrypoint覆盖。
ENTRYPOINT 可以和 CMD 组合使用。
例如 dockerfile 中
ENTRYPOINT [/usr/sbin/nginx]
CMD [-h]
运行 docker 容器
docker run -d --name nginx_web3 -p 80 -d hexiaoming/df_test1 -g "deamon off;"
这时会覆盖 cmd 中参数。
ADD <src>...<dest>
ADD["src"..."dest"](适用于文件路径中有空格的情况)
来源地址如果是本地地址必须是构建目录中的相对地址,docker 不推荐使用远程地址推荐用 wget 之类的下载下来再指定。
目标路径需要指定镜像中的绝对路径
COPY <src>...<dest>
COPY["src"..."dest"](适用于文件路径中有空格的情况)
ADD vs. COPY
ADD 包含类似的tar的解压功能
如果单纯复制文件,Docker推荐使用COPY
示例
在 dockerfile 目录添加了个 index.html 文件替换 docker 中 nginx 的默认页
向容器中添加卷
VOLUME ["/data"]
在构建中为后续的指令指定工作目录,一般使用绝对路径,如果是相对路径工作目录会一直传递下去
WORKDIR /path/to/workdir
设置环境变量
构建过程中及运行运行过程中同样有效
ENV <key><value>
ENV <key>=<value>...
镜像会以什么用户去运行
USER daemon
示例
会以 nginx 的用户去运行
USER nginx
可以是任意组合,不指定以 root 用户去运行
镜像触发器
当一个镜像被其他镜像作为基础镜像时执行 会在构建过程中插入指令
ONBUILD [INSTRUCTION]
ONBUILD 中指定的命令并不会在本次镜像构建过程中构建。
dockerfile 构建过程
中间层的容器会删除,镜像会保留,可以根据中间层镜像进行调试、查找错误
构建缓存
docker会把之前的镜像看做缓存 当你执行同样的命令构建镜像,会使用缓存 不使用缓存 docker build --no-cache
docker 容器的网络连接 以下得在 linux 运行
docker 容器的网络基础 docker0
sudo apt-get install bridge-utils sudo brctl show
ifconfig 查看 linux 会有 docker0 的网桥
macos 没有得装软件,往下继续看
OSI 七层模型中的网桥
- linux 虚拟网桥的特点:
linux 修改 docker0 地址:
ifconfig 查看 docker0 网卡地址为 172.121.1.2
修改地址
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
sudo service docker restart
docker run -it ubuntu /bin/bash
ifconfig
echo 已经修改为我们修改的地址
自定义虚拟网桥
sudo vim /etc/default/docker
增加DOCKER_OPS="-b=br0"
docker 容器的互联
- 以下是 linux 中的操作,因为依赖 linux 的 iptables
一个宿主机上的 docker 容器默认可以互联。
指定 docker 间不能访问。在默认配置文件中添加
DOCKER_OPS="--ICC=false"
启动 cct3 链接到 cct1 上给 cct1 起别名 webtest
用虚拟机访问 docker 中的端口能访问通
查看当前虚拟机地址
查看 cct6 的端口映射为 49154
docker 容器的数据管理
这个不依赖 linux 系统的 iptables,在 mac 上可以操作
- docker 容器的数据卷
docker run -it -v /tmp:/data ubuntu /bin/bash
docker inspect fc8d003898d5
设置为加载卷只读
docker run -it -v /tmp:/data:ro ubuntu /bin/bash
docker inspect fce42ddc61ecs
使用 dockerfile 构建包含数据卷的镜像
VOLUME ["/data"]
docker build -t ubuntu .
docker run --name dvt3 -it ubuntu
exit
docker inspect dvt3
docker 的数据卷容器
什么是数据卷容器:
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。
挂载数据卷容器的方法
docker run --volumes-from [CONTAINER NAME]
创建数据卷容器 dvt4
docker run -it --name dvt4 ubuntu
在下边创建个文件
使用容器 dvt5 去挂载这个数据卷容器
docker run -it --name dvt5 --volumes-from dvt4 ubuntu /bin/bash
也在下边创建个新文件
使用容器 dv6 去挂载这个数据卷容器 在下边查看文件发现文件数据是同步的
docker run -it --name dvt6 --volumes-from dvt4 ubuntu /bin/bash
docker inspect --format="{{.Mounts}}" dvt5 docker inspect --format="{{.Mounts}}" dvt6
这俩容器的数据挂载的数据是一致的
使用数据卷容器挂载数据这个容器起到的作用:是将挂载配置传递到挂载了数据卷容器的应用容器中
以下是验证过程:
docker 数据卷的备份和还原
备份的原理:创建一个数据卷容器,在创建一个引用数据卷容器的新容器,并设置数据卷为本地下的某个目录,并用 tar -cvf 命令对数据卷目录进行打压缩。
备份:
必须以以下格式:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar cvf /backup/backup.tar 数据卷
示例:
cd /tmp
docker run --volumes-from dvt5 -v /tmp:/backup --name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume1
还原:
必须以以下格式:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar xvf /backup/backup.tar
新打开个 shell,进入到 dvt5 数据卷容器删除数据
开始还原
示例:
docker run --volumes-from dvt5 -v /tmp:/backup --name dvt11 ubuntu tar xvf /backup/dvt5.tar
在 dvt5 数据卷容器又看到数据了
docker 跨主机连接
使用网桥实现跨主机容器连接
网络拓扑
还没在 mac 上安装这些。先整理出来,以后再安装。
网络设置
docker 设置
reboot
另一台虚拟机
2. 使用 open vswitch 实现跨主机容器连接
环境准备
操作
Host2
因为要查找路由表
添加路由表查找指定机器,启动容器
3. 使用 weave 实现跨主机容器连接
环境准备
操作
curl -L git.io/weave -o /usr/bin/weave #下载用这个下载也行
chmod a+x /usr/bin/weave #赋予执行权限
weave launch #启动weave
格式:
weave launch ip | hostName #节点启动的时候连接到master (创建weave网络的主机叫master)
虚拟机 2 上的 docker 下载 weave 和 1 一样不做演示
192.168.59.103是虚拟机1上docker的地址
192.168.1.2是给虚拟机2上docker分配的地址
在虚拟机1上docker指定和虚拟机2上指定相同网段的地址,启动docker,
ping虚拟机2上docker容器,可以ping通
dockerfile 外部 jdk 和 tomcat 示例
docker images
使用 Docker 快速搭建 Mysql,并进行数据卷分离
https://www.jianshu.com/p/57420240e877
Dockerfile
1. runboot.sh
脚本
bash复制编辑sleep 10
java -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar
sleep 10
是为了确保某些服务(例如数据库、Eureka 注册中心等)在应用启动前就已启动并可用。你可以根据需要调整这个时间。java -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar
启动 JAR 包应用。-Djava.security.egd=file:/dev/./urandom
用于加速启动时的随机数生成,特别是在 Docker 容器中。
2. Dockerfile
配置
Dockerfile复制编辑FROM java:8
VOLUME /tmp
RUN mkdir /app
ADD config-1.0.0-SNAPSHOT.jar /app/app.jar
ADD runboot.sh /app/
RUN bash -c "touch /app/app.jar"
WORKDIR /app
RUN chmod +x runboot.sh
EXPOSE 8888
CMD /app/runboot.sh
FROM java:8
指定基础镜像为 Java 8。VOLUME /tmp
声明容器的临时目录。RUN mkdir /app
创建/app
目录,用于存放应用。ADD config-1.0.0-SNAPSHOT.jar /app/app.jar
将 JAR 文件添加到容器的/app
目录。注意这里需要保证 JAR 文件路径是正确的。ADD runboot.sh /app/
将脚本文件runboot.sh
添加到容器的/app
目录。RUN bash -c "touch /app/app.jar"
这个命令作用不大,可以忽略。它会创建一个空文件app.jar
,但这不必要,ADD
步骤已经将 JAR 文件添加到容器中。WORKDIR /app
将工作目录设置为/app
。RUN chmod +x runboot.sh
赋予脚本执行权限。EXPOSE 8888
暴露容器的 8888 端口。CMD /app/runboot.sh
设置容器启动时运行的命令,启动脚本runboot.sh
。
3. Maven 插件配置
你使用的是 docker-maven-plugin
来通过 Maven 构建 Docker 镜像。
xml复制编辑<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
<imageName>${project.name}:${project.version}</imageName>
:设置镜像名称为项目名称:版本号
。<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
:指定 Dockerfile 和相关文件所在的目录。<skipDockerBuild>false</skipDockerBuild>
:确保每次mvn clean package docker:build
都会构建 Docker 镜像。<resources>
:这部分配置了要添加到 Docker 镜像的资源,这里是构建后的 JAR 文件。
4. 使用 Maven 构建 Docker 镜像
在项目根目录下运行以下命令来清理、构建项目并构建 Docker 镜像:
bash
复制编辑
mvn clean package docker:build -DskipTests
mvn clean package
:清理并构建项目,生成 JAR 文件。docker:build
:构建 Docker 镜像。-DskipTests
:跳过单元测试(如果不需要测试的话)。
docker-compose
docker-compose up -d
docker-compose.yml
version: "3.8"
services:
postgresdb:
image: busybox
volumes:
- /var/lib/postgresql/data
postgres:
image: postgres
hostname: postgres
container_name: postgres
volumes_from:
- postgresdb
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
discovery:
image: "discovery:1.0.0-SNAPSHOT"
hostname: discovery
container_name: discovery
ports:
- "8761:8761"
config:
image: "config:1.0.0-SNAPSHOT"
hostname: config
container_name: config
links:
- discovery
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
ports:
- "8888:8888"
person:
image: "person:1.0.0-SNAPSHOT"
hostname: person
links:
- discovery
- config
- postgres
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "8082:8082"
some:
image: "some:1.0.0-SNAPSHOT"
hostname: some
links:
- discovery
- config
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "8083:8083"
ui:
image: "ui:1.0.0-SNAPSHOT"
hostname: ui
links:
- discovery
- config
- person
- some
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "80:80"
monitor:
image: "monitor:1.0.0-SNAPSHOT"
hostname: monitor
links:
- discovery
- config
- person
- some
- ui
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "8989:8989"
文件开头
version: "3.8"
- 指定
docker-compose
文件的版本,这里使用的是 Docker Compose 3.8 版本格式。不同版本会影响功能支持和语法。
服务定义
services:
- 定义所有的服务(containers)。每个服务会对应一个运行中的容器。
服务: postgresdb
postgresdb:
image: busybox
volumes:
- /var/lib/postgresql/data
postgresdb
:服务名称。image: busybox
:使用busybox
镜像,这是一个非常轻量级的 Linux 系统工具包,用作基础容器。volumes
:定义数据卷,将数据存储在主机路径/var/lib/postgresql/data
,保证数据库持久化存储,即使容器重启数据也不会丢失。
服务: postgres
postgres:
image: postgres
hostname: postgres
container_name: postgres
volumes_from:
- postgresdb
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
postgres
:服务名称。image: postgres
:使用官方postgres
镜像(PostgreSQL 数据库)。hostname: postgres
:设置容器的主机名为postgres
,其他容器可以通过这个名字访问该容器。container_name: postgres
:设置容器的名称为postgres
。volumes_from
:引用postgresdb
服务的数据卷,从而共享持久化存储。environment
:定义 PostgreSQL 的环境变量:
POSTGRES_USER
: 设置数据库用户名为postgres
。POSTGRES_PASSWORD
: 设置数据库密码为postgres
。
ports
:将宿主机的 5432 端口映射到容器的 5432 端口,允许外部访问数据库。
服务: discovery
discovery:
image: "discovery:1.0.0-SNAPSHOT"
hostname: discovery
container_name: discovery
ports:
- "8761:8761"
discovery
:服务名称。image: "discovery:1.0.0-SNAPSHOT"
:使用自定义构建的服务发现镜像(例如 Eureka 服务注册中心)。hostname: discovery
:设置容器的主机名为discovery
。container_name: discovery
:设置容器名称为discovery
。ports
:将宿主机的 8761 端口映射到容器的 8761 端口,供其他服务发现使用。
服务: config
config:
image: "config:1.0.0-SNAPSHOT"
hostname: config
container_name: config
links:
- discovery
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
ports:
- "8888:8888"
config
:服务名称。image: "config:1.0.0-SNAPSHOT"
:使用自定义配置中心的镜像。hostname: config
:设置容器的主机名为config
。container_name: config
:设置容器名称为config
。links
:指定依赖服务,这里表示config
服务依赖discovery
服务。environment
:
EUREKA_HOST
: 配置中心的服务发现地址为discovery
。EUREKA_PORT
: 服务发现的端口号为8761
。
ports
:将宿主机的 8888 端口映射到容器的 8888 端口,用于访问配置服务。
服务: person
person:
image: "person:1.0.0-SNAPSHOT"
hostname: person
links:
- discovery
- config
- postgres
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
ports:
- "8082:8082"
person
:服务名称。image: "person:1.0.0-SNAPSHOT"
:使用自定义业务服务镜像(如用户管理服务)。hostname: person
:设置容器的主机名为person
。links
:依赖服务,包括discovery
,config
, 和postgres
。environment
:
EUREKA_HOST
: 配置 Eureka 服务地址。EUREKA_PORT
: 服务发现端口号。SPRING_PROFILES_ACTIVE
: Spring 应用激活的配置环境为docker
。
ports
:将宿主机的 8082 端口映射到容器的 8082 端口。
改进:
使用 Docker 网络而不是 links
: Docker Compose 会自动为每个服务创建一个网络,容器可以通过服务名互相访问。links
已经被标记为废弃,不建议使用。只需依赖 服务名,它会自动解析为 DNS 名称。
例如,假设你的 docker-compose.yml
配置如下:
version: '3'
services:
discovery:
image: discovery:1.0.0-SNAPSHOT
hostname: discovery
ports:
- "8761:8761"
config:
image: config:1.0.0-SNAPSHOT
hostname: config
ports:
- "8888:8888"
person:
image: person:1.0.0-SNAPSHOT
hostname: person
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
在这种情况下,person
服务可以通过 discovery
服务名访问 Eureka 服务,而不需要 links
。
确保服务依赖顺序: 在一些情况下,discovery
服务需要在其他服务启动之前先启动,可以通过 depends_on
来确保启动顺序:
services:
person:
image: person:1.0.0-SNAPSHOT
depends_on:
- discovery
- config
environment:
EUREKA_HOST: discovery
EUREKA_PORT: 8761
SPRING_PROFILES_ACTIVE: docker
这样,person
服务在启动时会等待 discovery
和 config
服务先启动。