docker简单使用

发布于:2025-03-23 ⋅ 阅读:(19) ⋅ 点赞:(0)

简单介绍

声明: 我用的是 mac,以下不做说明一般都是在 mac 上做的操作。

一. docker 简介 —docker 初使用

Docker 查看版本

docker version

docker 查找 tutorial 镜像

docker search tutorial

img

下载仓库镜像到本地

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

img

提交镜像,相当于新创建了个镜像 learn/ping 是起的名字

docker commit id号 learn/ping

img

用新镜像运行个容器

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

  1. 查看内核版本

     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

img

在 ubuntu 容器中就和在 ubuntu 服务器一样 执行 ps -ef 测试 exit 退出

docker 容器的基本操作

docker ps [-a][-l]

-a表示列出所有创建的容器
-l 表示列出最新创建的容器

img

查看指定容器详细配置信息

docker inspect [id或者名字]

img

自定义容器名

docker run --name=自定义名 -i -t IMAGE /bin/bash

img

img

重新启动和停止容器:

docker start [-i] 容器名

img

删除停止的容器:(不能删除正在运行的容器)

docker rm 容器名

img

守护式容器: 什么是守护式容器: 能够长期运行 没有交互式会话 适合运行应用程序和服务

docker run --name=自定义名 -i -t IMAGE /bin/bash

img

Ctrl+P  Ctrl+Q组合键退出容器

img

这样会以后台运行

img

附加到运行中的容器:

docker attach 容器名

img

执行 exit 看到容器停止了

img

守护式容器

启动守护式容器:

docker run -d 镜像名[COMMAND][ARG...]
docker run --name dc1 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

img

查看容器日志:

docker logs [-f][-t][--tail] 容器名

-f --follows=true|false 默认为false 一直跟踪日志的变化并返回结果
-t --timestamps=true|false 默认为false 返回的结果上加上时间戳
--tail="all" 返回结尾处多少数量的日志

不指定返回 logs 所有的日志

img

img

-tf 一直跟新,按 Ctrl+c 停止

img

–tail 10 最近十条

img

-tail 0 最近的一条

img

查看容器内进程:

docker top 容器名

img

在运行的容器内启动新进程:

docker exec [-d][-i][-t] 容器名 [COMMAND][ARG...]

img

24120 是我们在容器中加进去的进程

停止守护式容器:

docker stop 容器名
docker kill 容器名

img

在容器中部署静态网站

设置容器的端口映射

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 部署流程

  1. 创建映射 80 端口的交互式容器

     docker run -p 80 --name web -i -t ubuntu /bin/bash
    
  2. 安装 nginx

     apt-get update
     apt-get install -y nginx
    
  3. 安装文本编辑器 vim

     apt-get install -y vim
    
  4. 创建静态页面

     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>
    
  5. 修改 nginx 配置文件

     whereis nginx #查找nginx的位置
    

img

  1. 打开 nginx 的配置文件

     vim /etc/nginx/sites-enabled/default #root指定到自己创建的静态文件目录,如果一致就不用修改了。
    

img

  1. 运行 nginx

     cd /
     nginx
    

img

img

Ctrl+P+Q 退出,让容器在后台运行。

img

  1. 验证网站访问

     curl http://127.0.0.1:32768
    

img

或者在浏览器输入

img

练习:

停止 web 容器

img

启动 web 容器

img

Ctrl+P+Q 让容器后台运行。

启动 web 容器中 nginx 服务

img

查看 web 容器配置

img

查看和删除镜像:

列出镜像
镜像标签和仓库
查看镜像
删除镜像

	docker images [OPTIONS] [REPOSITORY[:TAG]]
	  -a, --all=false             #显示所有镜像,默认不显示中间层的镜像
		  --digests         #显示摘要
	  -f, --filter=[] 过滤条件
		  --format string   使用Go模板打印漂亮的图像
		  --no-trunc=false 指定不使用截断的形式显示镜像的id
	  -q, --quiet=false 只显示镜像的id

可以为相同的镜像打上不同的标签

img

docker images --no-trunc

img

docker images -a

img

docker images -q

img

docker images ubuntu

img

查看镜像

docker inspect [OPTIONS] NAME|ID [NAME|ID...]
 -f, --format=” ”

img

删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]
Options:
  -f, --force=false      强制删除图像
	  --no-prune=false   会保留未打标签的父镜像

img

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

img

docker search --limit 4 ubuntu

img

拉取镜像

docker pull ubuntu:14.04

\2. 使用 --registry-mirror 选项

如果之前没用过,最好把自己的镜像上传到 dockerhub 或者私有部署上,这样设置完有可能会更新 docker 导致你的镜像和容器丢失。

https://www.daocloud.io

https://www.daocloud.io/mirror

配置 Docker 镜像站

  1. 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,其他版本可能有细微不同。更多详情请访问文档。

  2. macOS

Docker For Mac

右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中

加入下面的镜像地址:

http://f1361db2.m.daocloud.io

点击 Apply & Restart 按钮使设置生效。

Docker Toolbox 等配置方法请参考帮助文档。
  1. 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

img

img

重新登录dockerhub就可以了
注意:登录上去我之前的本地镜像都没了。呵呵

这个是我用的中国科技大学的国内镜像
https://docker.mirrors.ustc.edu.cn

img

开始推送镜像到 dockerhub 上

推送镜像的规范是:

  1. docker push 注册用户名 / 镜像名

tag 命令修改为规范的镜像:

docker tag ubuntu:12.10 hexiaoming/ubuntu

img

docker login
输入dockerhub用户名
输入dockerhub密码   #mac提示
你没有找到xxx的秘钥串,这个时候点击
还原默认值
输入dockerhub的密码看到shell 页面Login Succeeded登录成功了
这个时候可以上传了
docker push hexiaoming/ubuntu

img

看 dockerhub 已经上传上去镜像,dockerhub 上私有仓库只能有一个

img

  1. 使用 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)
    
  2. 启动个交互式容器

     docker run -it -p 80 --name commit_test ubuntu /bin/bash
     apt-get update
     apt-get install -y nginx
     exit
    

img

  1. 把容器提交为镜像

     docker commit -a 'hexiaoming' commit_test hexiaoming/commit_test1
     docker images
    

img

  1. 用镜像运行个容器(容器启动时运行 nginx 命令,已后台运行 - d)

     docker run -d --name nginx_web2 -p 80 hexiaoming/commit_test1 nginx -g "deamon off;"
    
     curl http://127.0.0.1:8080验证
    

img

  1. 使用 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 [])

img

img

正确的 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

img

运行镜像

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 本地访问

img

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 版本

img

官方文档

https://docs.docker.com/engine/api/sdk/examples/

测试

curl --unix-socket /var/run/docker.sock http:/v1.24/images/json

img

http 例子可以继续参考这个。

https://docs.docker.com/engine/api/v1.40/#

第三方的库,用于代码方式链接 docker

https://docs.docker.com/engine/api/sdk/

img

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 中参数。

img

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 的默认页

img

向容器中添加卷

VOLUME ["/data"]

在构建中为后续的指令指定工作目录,一般使用绝对路径,如果是相对路径工作目录会一直传递下去

WORKDIR /path/to/workdir

img

设置环境变量

构建过程中及运行运行过程中同样有效
ENV <key><value>
ENV <key>=<value>...

镜像会以什么用户去运行

USER daemon

示例

会以 nginx 的用户去运行

USER nginx

可以是任意组合,不指定以 root 用户去运行

img

镜像触发器

当一个镜像被其他镜像作为基础镜像时执行 会在构建过程中插入指令
ONBUILD [INSTRUCTION]

img

ONBUILD 中指定的命令并不会在本次镜像构建过程中构建。

dockerfile 构建过程

img

中间层的容器会删除,镜像会保留,可以根据中间层镜像进行调试、查找错误
  1. 构建缓存

     docker会把之前的镜像看做缓存
     当你执行同样的命令构建镜像,会使用缓存
     不使用缓存
     docker build --no-cache
    

docker 容器的网络连接 以下得在 linux 运行

  1. docker 容器的网络基础 docker0

    sudo apt-get install bridge-utils sudo brctl show

img

img

img

ifconfig 查看 linux 会有 docker0 的网桥

img

macos 没有得装软件,往下继续看

OSI 七层模型中的网桥

img

  1. linux 虚拟网桥的特点:

img

img

linux 修改 docker0 地址:

ifconfig 查看 docker0 网卡地址为 172.121.1.2

修改地址

sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

img

sudo service docker restart

docker run -it ubuntu /bin/bash

ifconfig

echo 已经修改为我们修改的地址

自定义虚拟网桥

img

img

sudo vim /etc/default/docker
增加DOCKER_OPS="-b=br0"

img

docker 容器的互联

  1. 以下是 linux 中的操作,因为依赖 linux 的 iptables

img

img

一个宿主机上的 docker 容器默认可以互联。

指定 docker 间不能访问。在默认配置文件中添加

img

DOCKER_OPS="--ICC=false"

img

启动 cct3 链接到 cct1 上给 cct1 起别名 webtest

img

img

img

用虚拟机访问 docker 中的端口能访问通

img

查看当前虚拟机地址

img

img

img

查看 cct6 的端口映射为 49154

img

img

docker 容器的数据管理

这个不依赖 linux 系统的 iptables,在 mac 上可以操作

  1. docker 容器的数据卷

img

img

docker run -it -v /tmp:/data ubuntu /bin/bash

img

docker inspect fc8d003898d5

img

设置为加载卷只读

docker run -it -v /tmp:/data:ro ubuntu /bin/bash

img

img

img

docker inspect fce42ddc61ecs

img

使用 dockerfile 构建包含数据卷的镜像

VOLUME ["/data"]

img

docker build -t ubuntu .

img

docker run --name dvt3 -it ubuntu

img

exit
docker inspect dvt3

img

docker 的数据卷容器

什么是数据卷容器:

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。

img

挂载数据卷容器的方法

docker run --volumes-from [CONTAINER NAME]
  1. 创建数据卷容器 dvt4

     docker run -it --name dvt4 ubuntu
    
  2. 在下边创建个文件

img

  1. 使用容器 dvt5 去挂载这个数据卷容器

     docker run -it --name dvt5 --volumes-from dvt4 ubuntu /bin/bash
    

    也在下边创建个新文件

    img

    使用容器 dv6 去挂载这个数据卷容器 在下边查看文件发现文件数据是同步的

     docker run -it --name dvt6 --volumes-from dvt4 ubuntu /bin/bash
    

    img

     docker inspect --format="{{.Mounts}}" dvt5
     docker inspect --format="{{.Mounts}}" dvt6
    

    这俩容器的数据挂载的数据是一致的

    img

    img

     使用数据卷容器挂载数据这个容器起到的作用:是将挂载配置传递到挂载了数据卷容器的应用容器中
    

以下是验证过程:

img

docker 数据卷的备份和还原

备份的原理:创建一个数据卷容器,在创建一个引用数据卷容器的新容器,并设置数据卷为本地下的某个目录,并用 tar -cvf 命令对数据卷目录进行打压缩。

img

img

img

备份:

必须以以下格式:
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

img

还原:

必须以以下格式:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar xvf /backup/backup.tar

新打开个 shell,进入到 dvt5 数据卷容器删除数据

img

开始还原

示例:
docker run --volumes-from dvt5 -v /tmp:/backup --name dvt11 ubuntu tar xvf /backup/dvt5.tar

img

在 dvt5 数据卷容器又看到数据了

img

docker 跨主机连接

img

  1. 使用网桥实现跨主机容器连接

    网络拓扑

img

还没在 mac 上安装这些。先整理出来,以后再安装。

img

网络设置

img

docker 设置

img

img

img

img

img

reboot

img

img

img

另一台虚拟机

img

img

img

2. 使用 open vswitch 实现跨主机容器连接

img

img

环境准备

img

操作

img

img

img

img

Host2

img

img

img

因为要查找路由表

添加路由表查找指定机器,启动容器

img

img

img

3. 使用 weave 实现跨主机容器连接

img

环境准备

img

操作

img

img

  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 一样不做演示

img

192.168.59.103是虚拟机1上docker的地址
192.168.1.2是给虚拟机2上docker分配的地址
在虚拟机1上docker指定和虚拟机2上指定相同网段的地址,启动docker,
ping虚拟机2上docker容器,可以ping通

img

dockerfile 外部 jdk 和 tomcat 示例

img

img

img

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
  1. postgresdb:服务名称。
  2. image: busybox:使用 busybox 镜像,这是一个非常轻量级的 Linux 系统工具包,用作基础容器。
  3. 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"
  1. postgres:服务名称。

  2. image: postgres:使用官方 postgres 镜像(PostgreSQL 数据库)。

  3. hostname: postgres:设置容器的主机名为 postgres,其他容器可以通过这个名字访问该容器。

  4. container_name: postgres:设置容器的名称为 postgres

  5. volumes_from:引用 postgresdb 服务的数据卷,从而共享持久化存储。

  6. environment
    

    :定义 PostgreSQL 的环境变量:

    • POSTGRES_USER: 设置数据库用户名为 postgres
    • POSTGRES_PASSWORD: 设置数据库密码为 postgres
  7. ports:将宿主机的 5432 端口映射到容器的 5432 端口,允许外部访问数据库。


服务: discovery

  discovery:
    image: "discovery:1.0.0-SNAPSHOT"
    hostname: discovery
    container_name: discovery
    ports:
      - "8761:8761"
  1. discovery:服务名称。
  2. image: "discovery:1.0.0-SNAPSHOT":使用自定义构建的服务发现镜像(例如 Eureka 服务注册中心)。
  3. hostname: discovery:设置容器的主机名为 discovery
  4. container_name: discovery:设置容器名称为 discovery
  5. 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"
  1. config:服务名称。

  2. image: "config:1.0.0-SNAPSHOT":使用自定义配置中心的镜像。

  3. hostname: config:设置容器的主机名为 config

  4. container_name: config:设置容器名称为 config

  5. links:指定依赖服务,这里表示 config 服务依赖 discovery 服务。

  6. environment
    

    • EUREKA_HOST: 配置中心的服务发现地址为 discovery
    • EUREKA_PORT: 服务发现的端口号为 8761
  7. 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"
  1. person:服务名称。

  2. image: "person:1.0.0-SNAPSHOT":使用自定义业务服务镜像(如用户管理服务)。

  3. hostname: person:设置容器的主机名为 person

  4. links:依赖服务,包括 discovery, config, 和 postgres

  5. environment
    

    • EUREKA_HOST: 配置 Eureka 服务地址。
    • EUREKA_PORT: 服务发现端口号。
    • SPRING_PROFILES_ACTIVE: Spring 应用激活的配置环境为 docker
  6. 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 服务在启动时会等待 discoveryconfig 服务先启动。