docker简单使用

docker简单使用

  • 简单介绍
  • [一. docker 简介 ---docker 初使用](#一. docker 简介 ---docker 初使用)
  • [二。安装 docker](#二。安装 docker)
  • [docker 容器的基本操作](#docker 容器的基本操作)
  • 在容器中部署静态网站
  • 练习:
  • 查看和删除镜像:
  • 查看镜像
  • 删除镜像
  • 根据镜像仓库和标签只能删除一个
  • [docker 批量删除容器、镜像](#docker 批量删除容器、镜像)
  • 获取和推送镜像
  • 拉取镜像
  • [配置 Docker 镜像站](#配置 Docker 镜像站)
  • [开始推送镜像到 dockerhub 上](#开始推送镜像到 dockerhub 上)
  • [docker 守护进程的配置和操作](#docker 守护进程的配置和操作)
  • 查看守护进程
  • [RUN <command> (shell 模式)](#RUN <command> (shell 模式))
  • [EXPOSE 指定运行该镜像的容器使用的端口](#EXPOSE 指定运行该镜像的容器使用的端口)
  • [run 和 cmd 区别](#run 和 cmd 区别)
  • 向容器中添加卷
  • 设置环境变量
  • 镜像触发器
  • [dockerfile 构建过程](#dockerfile 构建过程)
  • [docker 容器的网络连接 以下得在 linux 运行](#docker 容器的网络连接 以下得在 linux 运行)
  • [OSI 七层模型中的网桥](#OSI 七层模型中的网桥)
  • 自定义虚拟网桥
  • [docker 容器的互联](#docker 容器的互联)
  • [docker 容器的数据管理](#docker 容器的数据管理)
  • 设置为加载卷只读
  • [使用 dockerfile 构建包含数据卷的镜像](#使用 dockerfile 构建包含数据卷的镜像)
  • [docker 的数据卷容器](#docker 的数据卷容器)
  • [docker 数据卷的备份和还原](#docker 数据卷的备份和还原)
  • [docker 跨主机连接](#docker 跨主机连接)
  • [2. 使用 open vswitch 实现跨主机容器连接](#2. 使用 open vswitch 实现跨主机容器连接)
  • [3. 使用 weave 实现跨主机容器连接](#3. 使用 weave 实现跨主机容器连接)
  • [dockerfile 外部 jdk 和 tomcat 示例](#dockerfile 外部 jdk 和 tomcat 示例)
  • [使用 Docker 快速搭建 Mysql,并进行数据卷分离](#使用 Docker 快速搭建 Mysql,并进行数据卷分离)
  • Dockerfile
      • [1. `runboot.sh` 脚本](#1. runboot.sh 脚本)
      • [2. `Dockerfile` 配置](#2. Dockerfile 配置)
      • [3. Maven 插件配置](#3. Maven 插件配置)
      • [4. 使用 Maven 构建 Docker 镜像](#4. 使用 Maven 构建 Docker 镜像)
  • docker-compose
      • **文件开头**
      • **服务定义**
      • [**服务: postgresdb**](#服务: postgresdb)
      • [**服务: postgres**](#服务: postgres)
      • [**服务: discovery**](#服务: discovery)
      • [**服务: config**](#服务: config)
      • [**服务: person**](#服务: person)
    • 改进:

简单介绍

声明: 我用的是 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

  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

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

  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的位置
  1. 打开 nginx 的配置文件

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

    复制代码
     cd /
     nginx

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

  1. 验证网站访问

    复制代码
     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 镜像站

  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
复制代码
重新登录dockerhub就可以了
注意:登录上去我之前的本地镜像都没了。呵呵

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

开始推送镜像到 dockerhub 上

推送镜像的规范是:

  1. 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 上私有仓库只能有一个

  1. 使用 commit 构建镜像

    复制代码
     docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
       -a, --author string    Author (e.g., "John Hannibal Smith <[email protected]>")
       -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
  1. 把容器提交为镜像

    复制代码
     docker commit -a 'hexiaoming' commit_test hexiaoming/commit_test1
     docker images
  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验证
  1. 使用 dockerfile 构建镜像

    复制代码
     创建dockerfile
     使用docker build命令
    
     #First Dockerfile
     FROM ubuntu:14.04  #镜像的基础
     MAINTAINER hexiaoming "[email protected]"  #镜像的维护人
     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 "[email protected]"
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 构建过程

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

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

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

  1. docker 容器的网络基础 docker0

    sudo apt-get install bridge-utils sudo brctl show

ifconfig 查看 linux 会有 docker0 的网桥

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

OSI 七层模型中的网桥

  1. 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 容器的互联

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

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

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

复制代码
DOCKER_OPS="--ICC=false"

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

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

查看当前虚拟机地址

查看 cct6 的端口映射为 49154

docker 容器的数据管理

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

  1. 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]
  1. 创建数据卷容器 dvt4

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

  1. 使用容器 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 跨主机连接

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

    网络拓扑

还没在 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

bash 复制代码
docker-compose up -d

docker-compose.yml

yaml 复制代码
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 服务的数据卷,从而共享持久化存储。

复制代码
   environment

:定义 PostgreSQL 的环境变量:

  • POSTGRES_USER: 设置数据库用户名为 postgres
  • POSTGRES_PASSWORD: 设置数据库密码为 postgres
  1. 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 服务。

复制代码
   environment

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

复制代码
   environment

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

相关推荐
AWS官方合作商44 分钟前
AWS CloudWatch 实战:构建智能监控与自动化运维体系
运维·自动化·aws
java资料站1 小时前
linux ntpdate 时间矫正
linux·运维·python
等个结果1 小时前
CentOS 7 部署RuoYi 项目
linux·运维·centos
轩凌云2 小时前
华为单臂路由 与 策略路由
运维·网络·华为
Sʜᴀᴅᴏᴡ . ₪3362 小时前
Tomcat-Thales靶机攻略
linux·运维·服务器
屎派克2 小时前
linux和windows是采用何种机制保存密码的?
linux·运维·服务器
张小九992 小时前
Linux修改默认shell为zsh
linux·运维·服务器
Claus-3 小时前
进程间通信—system v标准
linux·运维·jvm
Hello.Reader3 小时前
使用nohup和--remove-source-files在后台运行rsync并记录日志
运维·服务器·网络
黎明晓月3 小时前
Docker容器的kafka在VM虚拟机挂起重新运行之后连接异常解决
docker·容器·kafka