Docker
参考资料
官方文档:https://docs.docker.com/docker-for-windows/
【官方文档超级详细】
【发布到仓库,git pull push】
b站教程:https://www.bilibili.com/video/BV1og4y1q7M4?
【这个教程非常简洁!且深入!基于企业应用场景!推荐!以下笔记都基于该课程】
前期基础
linux基本命令,类似cd,mkdir等
Docker概述
Docker为什么会出现
一款产品,开发和上线两套环境,应用环境配置费时费力,而且容易出问题
尤其对于机器学习和深度学习的库更是如此,很可能存在版本问题、底层依赖冲突问题
所以发布项目时,不只是一套代码过去,而是代码+环境整体打包过去
所谓开发即运维,保证系统稳定性,提高部署效率
使用Docker后的流程:
开发:建立模型–环境–打包带上环境,即镜像–放到Docker仓库
部署:下载Docker中的镜像,直接运行即可
Docker的思想来自于集装箱,集装箱,对环境进行隔离
Docker通过隔离机制,可以将服务器利用到极致。
Docker的历史
2010年,几个搞IT的人,在美国成立一家公司dotCloud
做一些pass的云计算服务
他们将自己的容器化技术命名为Docker
Docker基于Go语言开发
Docker刚刚诞生的时候,没有引起行业的注意,dotCloud活不下去
然后他们决定开源
2013年,创始人将Docker开源,不开则以,一开惊人,刚开源的时候,每个月都会更新一个版本
2014年4月9日,Docker 1.0发布
容器vs虚拟机
在容器技术出来之前,用的是虚拟机技术
虚拟机原理示意图
缺点:
- 资源占用多
- 冗余步骤多
- 启动很慢
容器化技术示意图
不是模拟的完整的操作系统
二者对比
比较虚拟机和Docker的不同
传统虚拟机 | Docker | |
---|---|---|
虚拟内容 | 硬件+完整的操作系统+软件 | APP+LIB |
大小 | 笨重,通常几个G | 轻便几个M或KB |
启动速度 | 慢,分钟级 | 快,秒级 |
Docker安装
Docker的基本组成
明确几个概念:
镜像(image):docker镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器,类似Python中的Class
容器(container):类似Python中通过Class创建的实例,Object;容器可以理解为一个简易的系统
仓库(repository):存放镜像的地方,
分为共有仓库和私有仓库
Docker Hub:国外的
阿里云:配置镜像加速
环境准备
我们要有一台服务器,并且可以操作它
- Linux命令基础,购买linux阿里云的服务器
- CentOS 7
- 使用Xshell链接远程服务器
安装xshell
下载CentOS7 https://www.jianshu.com/p/a63f47e096e8
下载VMware 360软件管家下载
VMware配置虚拟机 https://blog.csdn.net/babyxue/article/details/80970526
xshell链接服务器 https://blog.csdn.net/zzy1078689276/article/details/77280814
1 | [root@192 ~]# cd / |
2 | [root@192 /]# pwd |
3 | / |
4 | [root@192 /]# ls |
5 | bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var |
6 | [root@192 /]# uname -r |
7 | 3.10.0-1127.el7.x86_64 |
用户名
密码
查看ip:vmware里面输入,ip addIPr
视频书签,p602:20
https://www.bilibili.com/video/BV1og4y1q7M4?p=6
Centos安装
https://docs.docker.com/engine/install/centos/
卸载旧的版本
1 | # 卸载旧的版本 |
2 | $ sudo yum remove docker \ |
3 | docker-client \ |
4 | docker-client-latest \ |
5 | docker-common \ |
6 | docker-latest \ |
7 | docker-latest-logrotate \ |
8 | docker-logrotate \ |
9 | docker-engine |
安装基本环境
1 | # 安装基本的安装包 |
2 | $ sudo yum install -y yum-utils |
!
设置镜像的仓库
注意!!下载默认用国外的,太慢不要用!
用国内镜像,百度搜索,docker的阿里云镜像地址
1 | # 不要用官网默认这个! |
2 | $ sudo yum-config-manager \ |
3 | --add-repo \ |
4 | https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的 |
5 | |
6 | # 换成下面的 |
7 | |
8 | $ sudo yum-config-manager \ |
9 | --add-repo \ |
10 | https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云镜像 |
直接复制粘贴就OK了
更像软件包索引
1 | yum makecache fast |
没有问题的话就是可以用的
安装docker引擎
1 | yum install docker-ce docker-ce-cli containerd.io # docker-ce 社区版 ee 企业版 |
注意这里会有几个个y/n的判断
要看到Complet再收手!
docker 安装报错:
1 | 问题: |
2 | ackage containerd.io-1.2.0-3.el7.x86_64 is already installed. |
3 | Error: |
4 | Problem: package docker-ce-3:19.03.13-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed |
5 | - cannot install the best candidate for the job |
6 | |
7 | 解决方案: |
8 | yum install docker-ce docker-ce-cli containerd.io --nobest |
启动Docker
1 | systemctl start docker # 代表启动成功 |
1 | docker version |
1 | Client: Docker Engine - Community |
2 | Version: 19.03.11 |
3 | API version: 1.40 |
4 | Go version: go1.13.10 |
5 | Git commit: 42e35e61f3 |
6 | Built: Mon Jun 1 09:13:48 2020 |
7 | OS/Arch: linux/amd64 |
8 | Experimental: false |
9 | |
10 | Server: Docker Engine - Community |
11 | Engine: |
12 | Version: 19.03.11 |
13 | API version: 1.40 (minimum version 1.12) |
14 | Go version: go1.13.10 |
15 | Git commit: 42e35e61f3 |
16 | Built: Mon Jun 1 09:12:26 2020 |
17 | OS/Arch: linux/amd64 |
18 | Experimental: false |
19 | containerd: |
20 | Version: 1.2.13 |
21 | GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 |
22 | runc: |
23 | Version: 1.0.0-rc10 |
24 | GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd |
25 | docker-init: |
26 | Version: 0.18.0 |
27 | GitCommit: fec3683 |
1 | docker run hello-world |
中间一堆是签名信息
run的运行流程图
查看下载的镜像
1 | docker images |
卸载Docker
1 | # 卸载依赖 |
2 | yum remove docker-ce docker-ce-cli containerd.io |
3 | |
4 | # 删除资源 |
5 | rm -rf /var/lib/docker # docker 的默认工作路径 |
阿里云镜像加速
支付宝扫码登录,短信验证,确认授权
我有两个问题
阿里云镜像加速必须配置嘛?
哎呦我去: 加速快
哎呦我去: 要是翻墙就无所谓了
这个阿里云必须要买嘛,买哪个,我看阿里云好多产品
哎呦我去:不需要买
哎呦我去:免费的
哎呦我去:阿里云搜索容器服务
哎呦我去:有一个镜像加速
- 这个地址是哪来的呀
操作
控制台搜索 容器镜像服务
找到加速地址
1 | sudo mkdir -p /etc/docker # 创建一个陌路 |
2 | sudo tee /etc/docker/daemon.json <<-'EOF' |
3 | { |
4 | "registry-mirrors": ["https://uyfgafsw.mirror.aliyuncs.com"] |
5 | } |
6 | EOF # 编写配置文件 |
7 | |
8 | sudo systemctl daemon-reload # 重启服务 |
9 | sudo systemctl restart docker # 重启docker |
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程在主机上。通过Socket从客户端访问!
DockerServer接受到Docker-Client的指令,
Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- docker主要用的是宿主机的内核,vm需要Guest OS
所以说新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导
Docker命令
帮助命令
1 | docker version # 显示docker的基本信息 |
2 | docker info # 系统信息,镜像和容器的数量 |
3 | docker 命令 --help # 全部信息 |
镜像命令
docker images
查看所有本地主机上的镜像
1 | [root@192 ~]# docker images |
1 | # 解释 |
2 | REPOSITORY # 镜像仓库源 |
3 | TAG # 镜像的标签 |
4 | IMAGE ID # 镜像的ID |
5 | CREATED # 镜像的创建时间 |
6 | SIZE # 镜像的大小 |
1 | --all , -a Show all images (default hides intermediate images) # 显示所有 |
2 | --digests Show digests |
3 | --filter , -f Filter output based on conditions provided |
4 | --format Pretty-print images using a Go template |
5 | --no-trunc Don’t truncate output |
6 | --quiet , -q Only show numeric IDs # 只显示id |
docker search
搜索仓库中的镜像,相当于网页搜索
mysql
1 | docker search mysql |
1 | docker search --help |
1 | # 解释 |
2 | Options: |
3 | -f, --filter filter Filter output based on conditions provided |
4 | --format string Pretty-print search using a Go template |
5 | --limit int Max number of search results (default 25) |
6 | --no-trunc Don't truncate output |
1 | docker search mysql --filter=STARS=3000 # 搜索出Stars大于3000的 |
【视频书签,https://www.bilibili.com/video/BV1og4y1q7M4?p=9,13:44,太热了我要缓一缓】
docker pull
下载镜像
1 | docker pull mysql # 下载mysql镜像,default tag,默认最新版latest |
1 | [root@192 ~]# sudo systemctl daemon-reload |
2 | [root@192 ~]# sudo systemctl restart docker |
3 | [root@192 ~]# docker pull mysql |
4 | Using default tag: latest # 不写tag默认最新版 |
5 | latest: Pulling from library/mysql |
6 | 8559a31e96f4: Pull complete # layer 分层下载,docker image的核心 联合文件系统 |
7 | d51ce1c2e575: Pull complete |
8 | c2344adc4858: Pull complete |
9 | fcf3ceff18fc: Pull complete |
10 | 16da0c38dc5b: Pull complete |
11 | b905d1797e97: Pull complete |
12 | 4b50d1c6b05c: Pull complete |
13 | c75914a65ca2: Pull complete |
14 | 1ae8042bdd09: Pull complete |
15 | 453ac13c00a3: Pull complete |
16 | 9e680cd72f08: Pull complete |
17 | a6b5dc864b6c: Pull complete |
18 | Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6#签名 |
19 | Status: Downloaded newer image for mysql:latest |
20 | docker.io/library/mysql:latest # 真实地址 |
21 | |
22 | # 即 |
23 | docker pull mysql |
24 | # 等价于 |
25 | docker pull docker.io/library/mysql:latest |
1 | |
2 | # 指定版本下载 |
3 | docker pull mysql:5.7 |
版本来自于官网,版本库https://hub.docker.com/_/mysql
1 | docker images |
此时查看镜像,可以看到新下载的两个
docker rmi
remove images
1 | # 删除一个 可以通过名称 也可以指定id -f表示删除所有 |
2 | docker rmi -f 9cfcce23593a |
3 | # 删除多个 用空格分隔id |
4 | docker rmi -f id id id |
5 | # 删除所有 |
6 | docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除 |
容器命令
说明:有了镜像才能创建容器,linux,下载一个centos镜像来测试学习
1 | docker pull centos |
新建容器并启动
1 | docker run [可选参数] image |
2 | |
3 | 参数说明 |
4 | --name=“Name” # 容器名字,用于区分容器 |
5 | -d 后台方式运行 |
6 | -it 使用交互方式运行,进入容器查看内容 |
7 | -p 指定容器的端口 如-p 8080::8080 |
8 | -p ip:主机端口:容器端口 |
9 | -p 主机端口:容器端口 |
10 | -p 容器端口 |
11 | |
12 | -p 随机指定端口 |
进入退出容器
1 | # 进入 |
2 | docker run -it centos /bin/bash |
3 | # 查看目录 |
4 | ls |
5 | # 退出 |
6 | exit |
注意这里面主机名,编程了centos的id
这里面就是一个容器,套娃啊
查看运行的容器
1 | 查看正在运行的容器 |
2 | docker ps |
3 | 查看曾经运行的容器 |
4 | docker ps -a |
5 | 显示最近创建的容器,设置显示个数 |
6 | docker ps -a - n=? |
7 | 只显示容器的编号 |
8 | docker ps -aq |
1 | [root@192 ~]# docker ps |
2 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
3 | [root@192 ~]# docker ps -a |
4 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
5 | 9939864fa2e6 centos "bin/bash" 4 minutes ago Exited (0) 4 minutes ago unruffled_knuth |
6 | 5f42e9930435 centos "/bin/bash" 8 minutes ago Exited (0) 4 minutes ago lucid_cannon |
7 | a89ddb393d3d bf756fb1ae65 "/hello" 19 hours ago Exited (0) 19 hours ago gracious_bhabha |
8 | [root@192 ~]# docker ps -a -n=2 |
9 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
10 | 9939864fa2e6 centos "bin/bash" 6 minutes ago Exited (0) 6 minutes ago unruffled_knuth |
11 | 5f42e9930435 centos "/bin/bash" 10 minutes ago Exited (0) 7 minutes ago |
12 | [root@192 ~]# docker ps -aq |
13 | 9939864fa2e6 |
14 | 5f42e9930435 |
15 | a89ddb393d3d |
退出容器
1 | 容器停止退出 |
2 | exit |
3 | 容器不停止退出 注意必须在英文输入法下,中文输入法不行 |
4 | Ctrl + P + Q |
1 | [root@192 ~]# docker run -it centos /bin/bash |
2 | [root@bfcea13c40cd /]# [root@192 ~]# docker ps ##注意这里会自动给个命令,删掉 |
3 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
4 | bfcea13c40cd centos "/bin/bash" About a minute ago Up About a minute stoic_wilson |
5 | edbd9366d959 centos "/bin/bash" 7 minutes ago Up 7 minutes affectionate_bartik |
6 | [root@192 ~]# docker exec -it edbd9366d959 /bin/bash ## 再次进入 |
7 | [root@edbd9366d959 /]# exit ##停止并推出 |
8 | exit |
删除容器
1 | 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f |
2 | docker rm 容器id |
3 | 删除所有容器 |
4 | docker rm -f $(docker ps -aq) |
5 | 删除所有容器 |
6 | docker ps -a -q|xargs docker rm |
1 | [root@192 ~]# docker ps -a |
2 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
3 | bfcea13c40cd centos "/bin/bash" 29 minutes ago Up 29 minutes stoic_wilson |
4 | edbd9366d959 centos "/bin/bash" 35 minutes ago Up 35 minutes affectionate_bartik |
5 | 9939864fa2e6 centos "bin/bash" 48 minutes ago Exited (0) 48 minutes ago unruffled_knuth |
6 | 5f42e9930435 centos "/bin/bash" 52 minutes ago Exited (0) 49 minutes ago lucid_cannon |
7 | a89ddb393d3d bf756fb1ae65 "/hello" 20 hours ago Exited (0) 20 hours ago gracious_bhabha |
8 | [root@192 ~]# docker rm 5f42e9930435 |
9 | 5f42e9930435 |
10 | [root@192 ~]# docker rm edbd9366d959 # 注意正在运行的容器不能删除 |
11 | Error response from daemon: You cannot remove a running container edbd9366d9596c744dd449119269b04de2f2a494e7fc471f6396bcefd94c33fe. Stop the container before attempting removal or force remove |
1 | [root@192 ~]# docker ps -aq # 所有容器id |
2 | bfcea13c40cd |
3 | edbd9366d959 |
4 | 9939864fa2e6 |
5 | a89ddb393d3d |
6 | [root@192 ~]# docker rm -f $(docker ps -aq) # 全部删除 |
7 | bfcea13c40cd |
8 | edbd9366d959 |
9 | 9939864fa2e6 |
10 | a89ddb393d3d |
启动和停止容器的操作
1 | docker start |
2 | docker restart |
3 | docker stop |
4 | docker kill |
1 | [root@192 ~]# docker run -it centos /bin/bash |
2 | [root@7b1a7dd10ea4 /]# exit |
3 | exit |
4 | [root@192 ~]# docker ps #查看正在运行的 |
5 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
6 | [root@192 ~]# docker ps -a # 查看历史运行过的 |
7 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
8 | 7b1a7dd10ea4 centos "/bin/bash" 54 seconds ago Exited (0) 42 seconds ago fervent_mirzakhani |
9 | [root@192 ~]# docker start 7b1a7dd10ea4 # 启动当前这个容器 container id 粘过 来 |
10 | 7b1a7dd10ea4 |
11 | [root@192 ~]# docker ps # 查看当前运行容器 发现启动成功 |
12 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
13 | 7b1a7dd10ea4 centos "/bin/bash" 2 minutes ago Up 28 seconds fervent_mirzakhani |
14 | [root@192 ~]# docker stop 7b1a7dd10ea4 # 停止运行 |
15 | 7b1a7dd10ea4 |
16 | [root@192 ~]# docker ps # 再次查看 没有这个容器了 |
17 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
常用其他命令
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=11,不知不觉搞了一上午了,按部就班学东西的感觉真好,得找时间快点刷完】
后台启动docker
1 | docker run -d 镜像名 |
2 | 用docker ps 查看的时候 发现停止了 |
3 | |
4 | 后台运行,docker发现前台没有,容器启动后,发现自己没有提供服务,会立刻停止 |
1 | Last login: Wed Jun 17 19:47:35 2020 |
2 | [root@192 ~]# systemctl start docker # 关机后重启了,需要启动docker |
3 | [root@192 ~]# docker run -d centos # 运行 |
4 | 8ce188e5fee31c2fac93c0a405ee1a95c38dbc50cb47c35b19c0039c27558ded |
5 | [root@192 ~]# docker ps -a # 查看正在运行的 |
6 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
7 | 8ce188e5fee3 centos "/bin/bash" 19 seconds ago Exited (0) 18 seconds ago tender_dirac |
8 | 7b1a7dd10ea4 centos "/bin/bash" 8 hours ago Exited (0) 8 hours ago fervent_mirzakhani |
查看日志
1 | docker logs |
2 | docker logs -f -t --tail n 【id】 |
1 | [root@192 ~]# docker logs --help |
2 | |
3 | Usage: docker logs [OPTIONS] CONTAINER |
4 | |
5 | Fetch the logs of a container |
6 | |
7 | Options: |
8 | --details Show extra details provided to logs |
9 | -f, --follow Follow log output |
10 | --since string Show logs since timestamp (e.g. |
11 | 2013-01-02T13:23:37) or relative |
12 | (e.g. 42m for 42 minutes) |
13 | --tail string Number of lines to show from the |
14 | end of the logs (default "all") |
15 | -t, --timestamps Show timestamps # 时间戳 |
16 | --until string Show logs before a timestamp (e.g. |
17 | 2013-01-02T13:23:37) or relative |
18 | (e.g. 42m for 42 minutes) |
1 | whiel true;do echo shenzai;sleep |
1 | 运行一个 |
2 | [root@192 ~]# docker run -it centos /bin/bash |
3 | |
4 | [root@c2887d35c71d /]# [root@192 ~]# docker ps |
5 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
6 | c2887d35c71d centos "/bin/bash" 57 seconds ago Up 56 seconds vigorous_kare |
7 | |
8 | 查看日志,由于没有运行脚本,所以啥也没显示 |
9 | [root@192 ~]# docker logs -f -t --tail 10 c2887d35c71d |
10 | ^C # ctrl+c退出 |
11 | |
12 | 运行centos里面加个脚本 |
13 | [root@192 ~]# docker run -d centos /bin/sh -c "while true;do echo shenzai;sleep 1;done" |
14 | cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388 |
15 | |
16 | [root@192 ~]# docker ps |
17 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
18 | cb6d7fbc3f27 centos "/bin/sh -c 'while t…" 7 seconds ago Up 6 seconds dreamy_almeida |
19 | c2887d35c71d centos "/bin/bash" 3 minutes ago Up 3 minutes vigorous_kare |
20 | |
21 | 查看日志 发现隔一秒打印一条 |
22 | [root@192 ~]# docker logs -f -t --tail 10 cb6d7fbc3f27 |
23 | 2020-06-17T12:02:11.293765084Z shenzai |
24 | 2020-06-17T12:02:12.297675608Z shenzai |
25 | 2020-06-17T12:02:13.301845582Z shenzai |
26 | 2020-06-17T12:02:14.304800996Z shenzai |
27 | 2020-06-17T12:02:15.307130238Z shenzai |
28 | 2020-06-17T12:02:16.310574235Z shenzai |
29 | 2020-06-17T12:02:17.312946923Z shenzai |
30 | 2020-06-17T12:02:18.314841295Z shenzai |
31 | 2020-06-17T12:02:19.317021705Z shenzai |
32 | 2020-06-17T12:02:20.319670013Z shenzai |
33 | 2020-06-17T12:02:21.322651649Z shenzai |
34 | 2020-06-17T12:02:22.325466918Z shenzai |
35 | 2020-06-17T12:02:23.327984704Z shenzai |
36 | 2020-06-17T12:02:24.329656919Z shenzai |
查看正在运行的容器信息
1 | [root@192 ~]# docker inspect cb6d7fbc3f27 |
2 | [ |
3 | { |
4 | # 容器的完整id |
5 | "Id": "cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388", |
6 | |
7 | # 创建时间 |
8 | "Created": "2020-06-17T12:00:50.706906186Z", |
9 | |
10 | # 脚本位置 |
11 | "Path": "/bin/sh", |
12 | |
13 | # 运行的脚本 |
14 | "Args": [ |
15 | "-c", |
16 | "while true;do echo shenzai;sleep 1;done" |
17 | ], |
18 | "State": { |
19 | "Status": "running", # 状态,正在运行 |
20 | "Running": true, |
21 | "Paused": false, |
22 | "Restarting": false, |
23 | "OOMKilled": false, |
24 | "Dead": false, |
25 | "Pid": 1909, # 父进程id |
26 | "ExitCode": 0, |
27 | "Error": "", |
28 | "StartedAt": "2020-06-17T12:00:51.093617477Z", |
29 | "FinishedAt": "0001-01-01T00:00:00Z" |
30 | }, |
31 | |
32 | # 来源镜像 |
33 | "Image": "sha256:831691599b88ad6cc2a4abbd0e89661a121aff14cfa289ad840fd3946f274f1f", |
34 | "ResolvConfPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/resolv.conf", |
35 | "HostnamePath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hostname", |
36 | "HostsPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hosts", |
37 | "LogPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388-json.log", |
38 | |
39 | |
40 | "Name": "/dreamy_almeida", |
41 | "RestartCount": 0, |
42 | "Driver": "overlay2", |
43 | "Platform": "linux", |
44 | "MountLabel": "", |
45 | "ProcessLabel": "", |
46 | "AppArmorProfile": "", |
47 | "ExecIDs": null, |
48 | |
49 | # 主机配置 |
50 | "HostConfig": { |
51 | "Binds": null, |
52 | "ContainerIDFile": "", |
53 | "LogConfig": { |
54 | "Type": "json-file", |
55 | "Config": {} |
56 | }, |
57 | "NetworkMode": "default", |
58 | "PortBindings": {}, |
59 | "RestartPolicy": { |
60 | "Name": "no", |
61 | "MaximumRetryCount": 0 |
62 | }, |
63 | "AutoRemove": false, |
64 | "VolumeDriver": "", |
65 | "VolumesFrom": null, |
66 | "CapAdd": null, |
67 | "CapDrop": null, |
68 | "Capabilities": null, |
69 | "Dns": [], |
70 | "DnsOptions": [], |
71 | "DnsSearch": [], |
72 | "ExtraHosts": null, |
73 | "GroupAdd": null, |
74 | "IpcMode": "private", |
75 | "Cgroup": "", |
76 | "Links": null, |
77 | "OomScoreAdj": 0, |
78 | "PidMode": "", |
79 | "Privileged": false, |
80 | "PublishAllPorts": false, |
81 | "ReadonlyRootfs": false, |
82 | "SecurityOpt": null, |
83 | "UTSMode": "", |
84 | "UsernsMode": "", |
85 | "ShmSize": 67108864, |
86 | "Runtime": "runc", |
87 | "ConsoleSize": [ |
88 | 0, |
89 | 0 |
90 | ], |
91 | "Isolation": "", |
92 | "CpuShares": 0, |
93 | "Memory": 0, |
94 | "NanoCpus": 0, |
95 | "CgroupParent": "", |
96 | "BlkioWeight": 0, |
97 | "BlkioWeightDevice": [], |
98 | "BlkioDeviceReadBps": null, |
99 | "BlkioDeviceWriteBps": null, |
100 | "BlkioDeviceReadIOps": null, |
101 | "BlkioDeviceWriteIOps": null, |
102 | "CpuPeriod": 0, |
103 | "CpuQuota": 0, |
104 | "CpuRealtimePeriod": 0, |
105 | "CpuRealtimeRuntime": 0, |
106 | "CpusetCpus": "", |
107 | "CpusetMems": "", |
108 | "Devices": [], |
109 | "DeviceCgroupRules": null, |
110 | "DeviceRequests": null, |
111 | "KernelMemory": 0, |
112 | "KernelMemoryTCP": 0, |
113 | "MemoryReservation": 0, |
114 | "MemorySwap": 0, |
115 | "MemorySwappiness": null, |
116 | "OomKillDisable": false, |
117 | "PidsLimit": null, |
118 | "Ulimits": null, |
119 | "CpuCount": 0, |
120 | "CpuPercent": 0, |
121 | "IOMaximumIOps": 0, |
122 | "IOMaximumBandwidth": 0, |
123 | "MaskedPaths": [ |
124 | "/proc/asound", |
125 | "/proc/acpi", |
126 | "/proc/kcore", |
127 | "/proc/keys", |
128 | "/proc/latency_stats", |
129 | "/proc/timer_list", |
130 | "/proc/timer_stats", |
131 | "/proc/sched_debug", |
132 | "/proc/scsi", |
133 | "/sys/firmware" |
134 | ], |
135 | "ReadonlyPaths": [ |
136 | "/proc/bus", |
137 | "/proc/fs", |
138 | "/proc/irq", |
139 | "/proc/sys", |
140 | "/proc/sysrq-trigger" |
141 | ] |
142 | }, |
143 | |
144 | # 其他配置 |
145 | "GraphDriver": { |
146 | "Data": { |
147 | "LowerDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907-init/diff:/var/lib/docker/overlay2/7f79322e0f58d651a84a555dadd83d92537788172525945d3f538dd95dce336c/diff", |
148 | "MergedDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/merged", |
149 | "UpperDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/diff", |
150 | "WorkDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/work" |
151 | }, |
152 | "Name": "overlay2" |
153 | }, |
154 | |
155 | "Mounts": [], # 挂载 |
156 | |
157 | # 基本配置 |
158 | "Config": { |
159 | "Hostname": "cb6d7fbc3f27", |
160 | "Domainname": "", |
161 | "User": "", |
162 | "AttachStdin": false, |
163 | "AttachStdout": false, |
164 | "AttachStderr": false, |
165 | "Tty": false, |
166 | "OpenStdin": false, |
167 | "StdinOnce": false, |
168 | "Env": [ |
169 | "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" |
170 | ], # 基本环境变量,这里没有Java |
171 | |
172 | # 基本命令 |
173 | "Cmd": [ |
174 | "/bin/sh", |
175 | "-c", |
176 | "while true;do echo shenzai;sleep 1;done" |
177 | ], |
178 | "Image": "centos", |
179 | "Volumes": null, |
180 | "WorkingDir": "", |
181 | "Entrypoint": null, |
182 | "OnBuild": null, |
183 | "Labels": { |
184 | "org.label-schema.build-date": "20200611", |
185 | "org.label-schema.license": "GPLv2", |
186 | "org.label-schema.name": "CentOS Base Image", |
187 | "org.label-schema.schema-version": "1.0", |
188 | "org.label-schema.vendor": "CentOS" |
189 | } |
190 | }, |
191 | |
192 | # 网卡,比如现在用的是桥接的网卡 |
193 | "NetworkSettings": { |
194 | "Bridge": "", |
195 | "SandboxID": "4d701985d7e77aa153790b697b2f38a61e20555c224b7675e4bf650b82799882", |
196 | "HairpinMode": false, |
197 | "LinkLocalIPv6Address": "", |
198 | "LinkLocalIPv6PrefixLen": 0, |
199 | "Ports": {}, |
200 | "SandboxKey": "/var/run/docker/netns/4d701985d7e7", |
201 | "SecondaryIPAddresses": null, |
202 | "SecondaryIPv6Addresses": null, |
203 | "EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018", |
204 | "Gateway": "172.17.0.1", |
205 | "GlobalIPv6Address": "", |
206 | "GlobalIPv6PrefixLen": 0, |
207 | "IPAddress": "172.17.0.3", |
208 | "IPPrefixLen": 16, |
209 | "IPv6Gateway": "", |
210 | "MacAddress": "02:42:ac:11:00:03", |
211 | "Networks": { |
212 | "bridge": { |
213 | "IPAMConfig": null, |
214 | "Links": null, |
215 | "Aliases": null, |
216 | "NetworkID": "22b0fd2290ccbc4e066a75d3f01bd8bf32ee4352c5bbcfc9f911287219219571", |
217 | "EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018", |
218 | "Gateway": "172.17.0.1", |
219 | "IPAddress": "172.17.0.3", |
220 | "IPPrefixLen": 16, |
221 | "IPv6Gateway": "", |
222 | "GlobalIPv6Address": "", |
223 | "GlobalIPv6PrefixLen": 0, |
224 | "MacAddress": "02:42:ac:11:00:03", |
225 | "DriverOpts": null |
226 | } |
227 | } |
228 | } |
229 | } |
230 | ] |
1 | 停止正在疯狂输出的那个容器 |
2 | [root@192 ~]# docker stop cb6d7fbc3f27 |
3 | cb6d7fbc3f27 |
进入当前正在运行的容器
1 | 我们通常容器都是使用后台方式运行的e |
2 | |
3 | docker exec -it 容器id bashSHELL |
4 | |
5 | 测试 |
6 | [root@192 ~]# docker ps |
7 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
8 | c2887d35c71d centos "/bin/bash" 35 minutes ago Up 35 minutes vigorous_kare |
9 | [root@192 ~]# docker exec -it c2887d35c71d /bin/bash |
10 | [root@c2887d35c71d /]# ls |
11 | bin etc lib lost+found mnt proc run srv tmp var |
12 | dev home lib64 media opt root sbin sys usr |
13 | [root@c2887d35c71d /]# ps -ef |
14 | UID PID PPID C STIME TTY TIME CMD |
15 | root 1 0 0 11:57 pts/0 00:00:00 /bin/bash |
16 | root 14 0 0 12:32 pts/1 00:00:00 /bin/bash |
17 | root 28 14 0 12:32 pts/1 00:00:00 ps -ef |
18 | [root@c2887d35c71d /]# c2887d35c71d |
19 | [root@c2887d35c71d /]# exit |
20 | exit |
21 | |
22 | 方式二 |
23 | [root@192 ~]# docker attach c2887d35c71d |
24 | [root@c2887d35c71d /]# |
25 | |
26 | 区别 |
27 | docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) |
28 | docker attach 进入容器正在执行的终端,不会启动新的进程 |
从容器内拷贝文件到主机上
1 | 运行 |
2 | [root@192 ~]# docker run -it centos |
3 | ctrl P Q 不关闭退出,查看 |
4 | [root@0569081aa89c /]# [root@192 ~]# docker ps |
5 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
6 | 0569081aa89c centos "/bin/bash" 19 seconds ago Up 19 seconds |
7 | hopeful_chebyshev |
8 | |
9 | 查看主机home下无文件 |
10 | [root@192 ~]# cd /home |
11 | [root@192 home]# ls |
12 | |
13 | 进入正在运行的容器 |
14 | [root@192 home]# docker attach 0569081aa89c |
15 | |
16 | 进入容器home目录 |
17 | [root@0569081aa89c /]# cd /home |
18 | |
19 | 在目录中创建java文件 |
20 | [root@0569081aa89c home]# touch test.java |
21 | |
22 | 退出并停止容器 |
23 | [root@0569081aa89c home]# exit |
24 | exit |
25 | |
26 | 查看现在运行的容器 |
27 | [root@192 home]# docker ps |
28 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
29 | |
30 | 容器虽然被停止,但是数据都会保留 |
31 | [root@192 home]# docker ps -a |
32 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
33 | 0569081aa89c centos "/bin/bash" 3 minutes ago Exited (0) 8 seconds ago hopeful_chebyshev |
34 | f589e5684a01 centos "/bin/bash" 44 minutes ago Exited (0) 44 minutes ago cranky_easley |
35 | cb6d7fbc3f27 centos "/bin/sh -c 'while t…" 54 minutes ago Exited (137) 42 minutes ago dreamy_almeida |
36 | c2887d35c71d centos "/bin/bash" 58 minutes ago Exited (127) 16 minutes ago vigorous_kare |
37 | 8ce188e5fee3 centos "/bin/bash" About an hour ago Exited (0) About an hour ago tender_dirac |
38 | 7b1a7dd10ea4 centos "/bin/bash" 9 hours ago Exited (0) 9 hours ago fervent_mirzakhani |
39 | |
40 | 容器数据拷贝到主机 |
41 | [root@192 home]# docker cp 0569081aa89c:/home/test.java /home |
42 | [root@192 home]# ls |
43 | test.java |
44 | |
45 | 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现自动同步 /home /home |
查看内容占用
1 | docker stats |
小结
1 | [root@192 home]# docker --help |
2 | |
3 | Usage: docker [OPTIONS] COMMAND |
4 | |
5 | A self-sufficient runtime for containers |
6 | |
7 | Options: |
8 | --config string Location of client config |
9 | files (default "/root/.docker") |
10 | -c, --context string Name of the context to use to |
11 | connect to the daemon |
12 | (overrides DOCKER_HOST env var |
13 | and default context set with |
14 | "docker context use") |
15 | -D, --debug Enable debug mode |
16 | -H, --host list Daemon socket(s) to connect to |
17 | -l, --log-level string Set the logging level |
18 | ("debug"|"info"|"warn"|"error"|"fatal") (default "info") |
19 | --tls Use TLS; implied by --tlsverify |
20 | --tlscacert string Trust certs signed only by |
21 | this CA (default |
22 | "/root/.docker/ca.pem") |
23 | --tlscert string Path to TLS certificate file |
24 | (default "/root/.docker/cert.pem") |
25 | --tlskey string Path to TLS key file (default |
26 | "/root/.docker/key.pem") |
27 | --tlsverify Use TLS and verify the remote |
28 | -v, --version Print version information and quit |
29 | |
30 | Management Commands: |
31 | builder Manage builds |
32 | config Manage Docker configs |
33 | container Manage containers |
34 | context Manage contexts |
35 | engine Manage the docker engine |
36 | image Manage images |
37 | network Manage networks |
38 | node Manage Swarm nodes |
39 | plugin Manage plugins |
40 | secret Manage Docker secrets |
41 | service Manage services |
42 | stack Manage Docker stacks |
43 | swarm Manage Swarm |
44 | system Manage Docker |
45 | trust Manage trust on Docker images |
46 | volume Manage volumes |
47 | |
48 | Commands: |
49 | attach Attach local standard input, output, and error streams to a running container |
50 | build Build an image from a Dockerfile |
51 | commit Create a new image from a container's changes |
52 | cp Copy files/folders between a container and the local filesystem |
53 | create Create a new container |
54 | diff Inspect changes to files or directories on a container's filesystem |
55 | events Get real time events from the server |
56 | exec Run a command in a running container |
57 | export Export a container's filesystem as a tar archive |
58 | history Show the history of an image |
59 | images List images |
60 | import Import the contents from a tarball to create a filesystem image |
61 | info Display system-wide information |
62 | inspect Return low-level information on Docker objects |
63 | kill Kill one or more running containers |
64 | load Load an image from a tar archive or STDIN |
65 | login Log in to a Docker registry |
66 | logout Log out from a Docker registry |
67 | logs Fetch the logs of a container |
68 | pause Pause all processes within one or more containers |
69 | port List port mappings or a specific mapping for the container |
70 | ps List containers |
71 | pull Pull an image or a repository from a registry |
72 | push Push an image or a repository to a registry |
73 | rename Rename a container |
74 | restart Restart one or more containers |
75 | rm Remove one or more containers |
76 | rmi Remove one or more images |
77 | run Run a command in a new container |
78 | save Save one or more images to a tar archive (streamed to STDOUT by default) |
79 | search Search the Docker Hub for images |
80 | start Start one or more stopped containers |
81 | stats Display a live stream of container(s) resource usage statistics |
82 | stop Stop one or more running containers |
83 | tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE |
84 | top Display the running processes of a container |
85 | unpause Unpause all processes within one or more containers |
86 | update Update configuration of one or more containers |
87 | version Show the Docker version information |
88 | wait Block until one or more containers stop, then print their exit codes |
作业练习
部署Nginx
1 | 官网搜索nginx,可以看到帮助文档 |
2 | |
3 | 下载镜像 |
4 | [root@192 home]# docker pull nginx |
5 | Using default tag: latest |
6 | latest: Pulling from library/nginx |
7 | 8559a31e96f4: Pull complete |
8 | 8d69e59170f7: Pull complete |
9 | 3f9f1ec1d262: Pull complete |
10 | d1f5ff4f210d: Pull complete |
11 | 1e22bfa8652e: Pull complete |
12 | Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133 |
13 | Status: Downloaded newer image for nginx:latest |
14 | docker.io/library/nginx:latest |
15 | |
16 | 查看镜像 |
17 | [root@192 home]# docker images |
18 | REPOSITORY TAG IMAGE ID CREATED SIZE |
19 | centos latest 831691599b88 13 hours ago 215MB |
20 | nginx latest 2622e6cca7eb 7 days ago 132MB |
21 | |
22 | 运行测试 |
23 | -d 后台运行,--name 命名,-p 暴露端口,3344服务器、宿主机的端口,容器内部端口 |
24 | [root@192 home]# docker run -d --name nginx01 -p:3344:80 nginx |
25 | 38dbf7bdcaef232d269b7184d91e44e06087181b5ee929494e177ad526810fa8 |
26 | [root@192 home]# docker ps |
27 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
28 | 38dbf7bdcaef nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:3344->80/tcp nginx01 |
29 | |
30 | 使用3344可以访问成功 |
31 | [root@192 home]# curl localhost:3344 |
32 | <!DOCTYPE html> |
33 | <html> |
34 | <head> |
35 | <title>Welcome to nginx!</title> |
36 | <style> |
37 | body { |
38 | width: 35em; |
39 | margin: 0 auto; |
40 | font-family: Tahoma, Verdana, Arial, sans-serif; |
41 | } |
42 | </style> |
43 | </head> |
44 | <body> |
45 | <h1>Welcome to nginx!</h1> |
46 | <p>If you see this page, the nginx web server is successfully installed and |
47 | working. Further configuration is required.</p> |
48 | |
49 | <p>For online documentation and support please refer to |
50 | <a href="http://nginx.org/">nginx.org</a>.<br/> |
51 | Commercial support is available at |
52 | <a href="http://nginx.com/">nginx.com</a>.</p> |
53 | |
54 | <p><em>Thank you for using nginx.</em></p> |
55 | </body> |
56 | </html> |
端口暴露
可以公网访问
找到服务器地址
浏览器输入 192.168.147.132:3344/
1 | [root@192 home]# docker ps |
2 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
3 | 38dbf7bdcaef nginx "/docker-entrypoint.…" 21 minutes ago Up 21 minutes 0.0.0.0:3344->80/tcp nginx01 |
4 | |
5 | 进入容器 |
6 | [root@192 home]# docker exec -it nginx01 /bin/bash |
7 | |
8 | 查一下nginx在哪 |
9 | root@38dbf7bdcaef:/# whereis nginx |
10 | nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx |
11 | |
12 | 到这个目录 |
13 | root@38dbf7bdcaef:/# cd /etc/nginx |
14 | root@38dbf7bdcaef:/etc/nginx# ls |
15 | conf.d koi-utf mime.types nginx.conf uwsgi_params |
16 | fastcgi_params koi-win modules scgi_params win-utf |
17 | |
18 | 退出 |
19 | root@38dbf7bdcaef:/etc/nginx# exit |
20 | exit |
21 | |
22 | 停止 |
23 | [root@192 home]# docker stop 38dbf7bdcaef |
24 | 38dbf7bdcaef |
再次刷新网页,服务关闭
思考问题:每次改动nginx配置文件,都需要进入容器内部,十分麻烦,要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?-v 数据卷技术!
部署tomcat
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=15】
【20200618毕竟生产力工具,加油搞,这周一定刷完!!每次关机都要重连,麻烦(╹▽╹)】
在docker hub上查看版本号和使用方法
官方文档一定要翻烂,超多版本,我的天呐~
官方方法
1 | docker run -it --rm tomcat:9.0 |
2 | |
3 | docker run 可以不用pull,能自动下载 |
4 | -it 直接进去运行 |
5 | --rm 是什么意思?入门的意思? |
6 | 我们之前的启动都是后台,停止了容器之后,容器还是可以查到 |
7 | 写了--rm,类似阅后即焚模式,用完即删除,这种通常用来测试 |
8 | |
9 | 最后冒号查好的版本号 |
ctrl+c退出
1 | docker ps -a |
可以看到并没有tomcat,印证阅后即焚模式,容器会删除,镜像不会删除
平时不建议这样搞
正常方法
1 | docker pull tomcat:9.0 # 之前下过了,应该不用下了,这里老师讲错了 |
1 | 启动运行,应该加上版本号 |
2 | docker run -d -p 3355:8080 --name tomcat01 tomcat |
1 | 进入容器 |
2 | docker exec -it tomcat01 /bin/bash |
发现问题
- linux命令少了
- 没有webapps
这是阿里云镜像的原因:默认使用最小镜像,所有不必要的都剔除了,保证最小可运行环境
再次找到结构
在浏览器中输入:http://192.168.147.132:3355/
思考问题:我们以后部署项目,如果每次都要进入容器是不是身份麻烦?我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了!
docker容器 tomcat+网站
docker mysql
部署es+kibana
1 | es 暴露的端口很多 |
2 | es 十分耗内存 |
3 | es 的数据一般需要放置到安全目录!挂载 |
4 | |
5 | 启动 elasticsearch |
6 | docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 |
7 | |
8 | 查看内存占用情况 |
9 | docker stats |
1 | 先赶紧stop一下 |
2 | docker stop ba18713ca536 |
1 | 通过 -e 限制内存 |
2 | docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 |
没成功啊,SEI能告诉我为啥!!
1 | docker run -d --name zbcn-es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 |
py0003null大佬:
“ES_JAVA_OPTS=-Xms64m -Xmx512m”py0003null大佬:
引号提前试试
原因是引号!!你没觉得怪怪的嘛
此时查看stats,发现内存占用在控制范围内
ctrl + C退出,记得stop
思考:用kibana链接elasticsearch
可视化
- portainer(先用这个)
- Rancher(CI/CD时用)
portainer
Docker图像化界面管理工具,提供一个后台面板供我们操作!
1 | docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker --privileged=true portainer/portainer |
访问外网8088
用户名
密码
【中午吃饭重连了一下,失败,不知道发生了啥】
【平时不会用这个,好吧,先往下】
Docker镜像
原理
UnionFS 联合文件系统
bootfs:boot file system
rootfs:root file system
Docker镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部,这一层就是我们通常说的容器层,容器层之下的都叫镜像层
commit提交镜像
1 | docker commit # 提交容器成为一个新的副本 |
2 | docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG] |
1 | docker images |
2 | docker run -it -p 8080:8080 tomcat |
这是一个前台程序
将webapps.dist里面所有的文件拷贝到webapps里面,其中-r必须有,表示目录递归拷贝
1 | docker commit -a="paidaxing" -m="add webapps app" 当前容器的id tomcat02:1.0 |
发现新的版本,比之前的大了一些,因为里面记录了我们的改动
如果想保存当前容器的状态,可以通过commit提交,获得一个镜像
好比我们以前学习VM的时候的快照
到这里算是入门了
接下来三个部分是docker的精髓
容器数据卷
什么是容器卷
docker是要将应用和环境打包成一个镜像
这样,数据就不应该在容器中,否则容器删除,数据就会丢失,这就是删库跑路
故容器之间要有一个数据共享技术
在Docker容器中产生的数据,同步到本地,这就是卷技术
本质上是一个目录挂载,将容器内的目录挂载到虚拟机上
目的:容器的持久化和同步操作
容器间可以数据共享
使用数据卷
方式一:直接使用命令来挂载
1 | docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口 |
2 | docker run -it -v -p |
3 | -it 交互式进入 |
4 | -v volume卷技术 |
5 | -p 主机端口 |
6 | |
7 | /home/ceshi:主机home目录下的ceshi文件夹 映射:centos容器中的/home |
8 | [root@iz2zeak7 home]# docker run -it -v /home/ceshi:/home centos /bin/bash |
9 | 这时候主机的/home/ceshi文件夹就和容器的/home文件夹关联了,二者可以实现文件或数据同步了 |
新开一个窗口
1 | docker inspect 容器id |
2 | |
3 | 通过 docker inspect 容器id 查看 |
4 | [root@iz2zeak7sgj6i7hrb2g862z home]# docker inspect 6064c490c371 |
找到挂载信息Mounts
测试
容器停止后,修改主机文件,再启动容器的时候,数据同样改变
双向同步
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
实战安装mysql
MySQL的数据持久化命令
1 | docker search mysql |
2 | |
3 | 拉取 |
4 | docker pull mysql:5.7 |
5 | |
6 | 挂载 |
7 | docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql5.7 |
8 | |
9 | -d 后台运行 |
10 | -p 端口映射 |
11 | -v 卷挂载 |
12 | -e 环境配置 安装启动mysql需要配置密码 |
13 | --name 容器名字 |
14 | |
15 | 实操 |
16 | 获取mysql镜像 |
17 | [root@iz2zeak7sgj6i7hrb2g862z home]# docker pull mysql:5.7 |
18 | 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点! |
19 | 参考官网hub |
20 | docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag |
21 | 启动我们得 |
22 | -d 后台运行 |
23 | -p 端口映射 |
24 | -v 卷挂载 |
25 | -e 环境配置 |
26 | -- name 容器名字 |
27 | docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql:5.7 |
28 | 启动成功之后,我们在本地使用sqlyog来测试一下 |
29 | sqlyog-连接到服务器的3306--和容器内的3306映射 |
30 | 在本地测试创建一个数据库,查看一下我们映射的路径是否ok! |
链接测试:打开SQLyog
点 测试链接
点 链接
当我们在本地用SQLyog新建名称为test的数据库时候,容器容器也会创建
假设我们将包含mysql的容器删除时,
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
具名和匿名挂载
1 | 匿名挂载 |
2 | -v 容器内路径! |
3 | docker run -d -P --name nginx01 -v /etc/nginx nginx |
4 | 查看所有的volume(卷)的情况 |
5 | docker volume ls |
6 | DRIVER VOLUME NAME # 容器内的卷名(匿名卷挂载) |
7 | local 21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0 |
8 | local b17f52d38f528893dd5720899f555caf22b31bf50b0680e7c6d5431dbda2802c |
9 | 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径! |
10 | 具名挂载 -P:表示随机映射端口 |
11 | docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx |
12 | 9663cfcb1e5a9a1548867481bfddab9fd7824a6dc4c778bf438a040fe891f0ee |
13 | 查看所有的volume(卷)的情况 |
14 | docker volume ls |
15 | DRIVER VOLUME NAME |
16 | local 21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0 |
17 | local b17f52d38f528893dd5720899f555caf22b31bf50b0680e7c6d5431dbda2802c |
18 | local juming-nginx #多了一个名字 |
19 | 通过 -v 卷名:查看容器内路径 |
20 | 查看一下这个卷 |
21 | docker volume inspect juming-nginx |
22 | [ |
23 | { |
24 | "CreatedAt": "2020-05-23T13:55:34+08:00", |
25 | "Driver": "local", |
26 | "Labels": null, |
27 | "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", #默认目录 |
28 | "Name": "juming-nginx", |
29 | "Options": null, |
30 | "Scope": "local" |
31 | } |
32 | ] |
区分三种挂在方式
1 | 三种挂载: 匿名挂载、具名挂载、指定路径挂载 |
2 | -v 容器内路径 #匿名挂载 |
3 | -v 卷名:容器内路径 #具名挂载 |
4 | -v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的 |
拓展:
1 | 通过 -v 容器内路径: ro rw 改变读写权限 |
2 | ro #readonly 只读 |
3 | rw #readwrite 可读可写 |
4 | docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx |
5 | docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx |
6 | ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作! |
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=23,有点累了,跟不动了,这两天运动太少了,有点颓】
DockerFile使用来构建docker镜像的文件
Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!
1 | 创建一个dockerfile文件,名字可以随便 建议Dockerfile |
2 | 文件中的内容: 指令(大写) + 参数 |
3 | vim dockerfile1 |
4 | FROM centos # 当前这个镜像是以centos为基础的 |
5 | VOLUME ["volume01","volume02"] # 挂载卷的卷目录列表(多个目录) |
6 | CMD echo "-----end-----" # 输出一下用于测试 |
7 | CMD /bin/bash # 默认走bash控制台 |
8 | 这里的每个命令,就是镜像的一层! |
9 | 构建出这个镜像 |
10 | -f dockerfile1 # f代表file,指这个当前文件的地址(这里是当前目录下的dockerfile1) |
11 | -t caoshipeng/centos # t就代表target,指目标目录(注意caoshipeng镜像名前不能加斜杠‘/’) |
12 | . # 表示生成在当前目录下 |
13 | docker build -f dockerfile1 -t caoshipeng/centos . |
14 | Sending build context to Docker daemon 2.56kB |
15 | Step 1/4 : FROM centos |
16 | latest: Pulling from library/centos |
17 | 8a29a15cefae: Already exists |
18 | Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700 |
19 | Status: Downloaded newer image for centos:latest |
20 | 470671670cac |
21 | Step 2/4 : VOLUME ["volume01","volume02"] # 卷名列表 |
22 | Running in c18eefc2c233 |
23 | Removing intermediate container c18eefc2c233 |
24 | 623ae1d40fb8 |
25 | Step 3/4 : CMD echo "-----end-----" # 输出 脚本命令 |
26 | Running in 70e403669f3c |
27 | Removing intermediate container 70e403669f3c |
28 | 0eba1989c4e6 |
29 | Step 4/4 : CMD /bin/bash |
30 | Running in 4342feb3a05b |
31 | Removing intermediate container 4342feb3a05b |
32 | f4a6b0d4d948 |
33 | Successfully built f4a6b0d4d948 |
34 | Successfully tagged caoshipeng/centos:latest |
35 | 查看自己构建的镜像 |
36 | docker images |
37 | REPOSITORY TAG IMAGE ID CREATED SIZE |
38 | caoshipeng/centos latest f4a6b0d4d948 About a minute ago 237MB |
kas:
没有安装吧?kas:
安装一下就可以了py9001021曾叙坚:
centos 默认使用vi写内容,vim需要下载py9001021曾叙坚:
是的,需要下载vim才能使用YF:
配置可以改下,字体就很炫酷了都建民:
用vi 试试都建民:
你没有安装vim都建民:
yum install vim都建民:
试试这个命令
1 | yum install vim # 编辑文件的,没有装一下 |
安装完之后就可以运行这个命令了
1 | 镜像是一层一层的,脚本是一行一行的 |
2 | 指令都是大写的 |
3 | 这里的每个命令可以理解为镜像的一层 |
4 | |
5 | FROM centos |
6 | |
7 | VOLUME ["volume01","volume02"] # 再创建镜像的时候就挂载出来 |
8 | |
9 | CMD echo "---end---" |
10 | CMD /bin/bash |
想保存并退出
Wesley.:
shift 加 冒号
1 | cat dockerfile1 |
2 | |
3 | docker build -f dockerfile1 -t padaxing/centos:1.0 . # 最后的点很重要 镜像名不能有/ |
1 | docker images |
启动生成的镜像
在容器内部创建一个文件
查看Mounts,Source对应容器外目录,匿名挂载卷
测试一下,在container volume01下生成文件
在主机挂载路径下,也同样生成
多个容器数据共享
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=25,周日下午,滨江,大雨,本来说这周六刷完的,发现周六啥也干不下去,除了吃就是睡,要么发呆研究小金库】
看一下有啥images
启动docker01,用之前建的padaxing/centos 1.0 镜像
1 | docker run -it --name docker01 padaxing/centos:1.0 # 1.0必须写 |
当前这个ctrl+p+q不停止退出
依次启动docker02、docker03
1 | docker run -it --name docker02 --volumes-from docker01 padaxing/centos:1.0 |
docker02继承docker01的volumes
可以验证,在docker01下加一个数据,在docker02下也会出现
创建docker03,同样继承docker01
1 | docker run -it --name docker03 --volumes-from docker01 padaxing/centos:1.0 |
在docker03的volume01下建立文件,在docker01的volume01下同样也有
即通过–volumes-from 可以实现不同容器间的数据共享
删除docker01,数据还在
1 | docker rm -f |
可以看到,删除docker01,进入docker02,数据依然在
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用位置
但是如果持久化到了本地,即使所有容器删除了,本地数据是不会删除的
数据卷容器2
多个MySQL同步数据!
命名的容器挂载数据卷!
1 | 测试 启动3个容器,通过刚才自己写的镜像启动 |
2 | 创建docker01:因为我本机是最新版,故这里用latest,狂神老师用的是1.0如下图 |
3 | docker run -it --name docker01 caoshipeng/centos:latest |
4 | 查看容器docekr01内容 |
5 | ls |
6 | bin home lost+found opt run sys var |
7 | dev lib media proc sbin tmp volume01 |
8 | etc lib64 mnt root srv usr volume02 |
9 | 不关闭该容器退出 |
10 | CTRL + Q + P |
11 | 创建docker02: 并且让docker02 继承 docker01 |
12 | docker run -it --name docker02 --volumes-from docker01 caoshipeng/centos:latest |
13 | 查看容器docker02内容 |
14 | ls |
15 | bin home lost+found opt run sys var |
16 | dev lib media proc sbin tmp volume01 |
17 | etc lib64 mnt root srv usr volume02 |
1 | 再新建一个docker03同样继承docker01 |
2 | docker run -it --name docker03 --volumes-from docker01 caoshipeng/centos:latest |
3 | cd volume01 #进入volume01 查看是否也同步docker01的数据 |
4 | ls |
5 | docker01.txt |
6 | 测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件 |
7 | 测试发现:数据依旧保留在docker02和docker03中没有被删除 |
多个mysql实现数据共享
1 | docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 |
2 | docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7 |
3 | 这个时候,可以实现两个容器数据同步! |
结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
DockerFile
是用来构建docker镜像的文件,可以理解为命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库 私有/共有)
这个写一个项目时一样的
官方DockerFile示例
看一下官方的DockerFile
可以看到官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方既然可以制作镜像,我们也可以
DockerFile基础知识
- 每个保留关键字(指令)都是必须是大写字母
- 按照从上到下顺序执行
#
表示注释- 每一个指令都会创建体检一个新的镜像层,并提交
docker是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业的交付标准,必须掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
DockerFile命令
1 | FROM # from:基础镜像,一切从这里开始构建 比如centos |
2 | MAINTAINER # 镜像是谁写的 姓名+邮箱 |
3 | RUN # run:镜像构建的时候需要运行的命令 |
4 | ADD # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录 |
5 | WORKDIR # workdir:镜像的工作目录 |
6 | VOLUME # volume:挂载的目录 |
7 | EXPOSE # 指定暴露端口,跟-p一个道理 |
8 | RUN # 最终要运行的 |
9 | CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代 |
10 | ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 |
11 | ONBUILD # onbuild:当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令 |
12 | COPY # copy:类似ADD,将文件拷贝到镜像中 |
13 | ENV # 构建的时候设置环境变量 |
实战构建自己的centos
Docker Hub中99%的镜像都是从FROM scratch开始的
添加centos7的压缩包
1 | 创建一个自己的centos |
2 | |
3 | 进入home目录 |
4 | cd /home |
5 | |
6 | 创建一个目录,之后的东西都保存到这里 |
7 | mkdir dockerfile |
8 | 进入这个目录 |
9 | cd dockerfile/ |
10 | 创建一个dockerfile,名字叫mydockerfile |
11 | vim mydockerfile-centos |
xshell新开一个界面
1 | 官方默认centos |
2 | docker run -it centos |
3 | pwd # 官方默认有pwd命令 |
4 | vim # 官方默认没有vim命令 |
5 | ifconfig # 官方默认没有ifconfig命令 |
回到mydockerfile
1 | 下面给官方centos加上自定义的内容 |
2 | FROM centos |
3 | MAINTAINER padaxing<010301200@hai.com> |
4 | |
5 | ENV MYPATH /usr/local |
6 | WORKDIR $MYPATH |
7 | |
8 | RUN yum -y install vim |
9 | RUN yum -y install net-tools |
10 | |
11 | EXPOSE 80 |
12 | |
13 | CMD echo $MYPATH |
14 | CMD echo "---end---" |
15 | CMD /bin/bash |
ESC, shif + : 输入wq保存并退出
如果写错了需要修改、
1 | vim mydockerfile-centos |
2 | 进入之后按i或者INSERT键即可修改 |
创建自己的centos 步骤
1 | 1./home下新建dockerfile目录 |
2 | mkdir dockerfile |
3 | 2. dockerfile目录下新建mydockerfile-centos文件 |
4 | vim mydockerfile-centos |
5 | 3.编写Dockerfile配置文件 |
6 | FROM centos # 基础镜像是官方原生的centos |
7 | MAINTAINER zbcn<zbcn810@163.com> # 作者 |
8 | |
9 | ENV MYPATH /usr/local # 配置环境变量的目录 |
10 | WORKDIR $MYPATH # 将工作目录设置为 MYPATH |
11 | |
12 | RUN yum -y install vim # 给官方原生的centos 增加 vim指令 |
13 | RUN yum -y install net-tools # 给官方原生的centos 增加 ifconfig命令 |
14 | |
15 | EXPOSE 80 # 暴露端口号为80 |
16 | |
17 | CMD echo $MYPATH # 输出下 MYPATH 路径 |
18 | CMD echo "-----end----" |
19 | CMD /bin/bash # 启动后进入 /bin/bash |
20 | |
21 | |
22 | 4.通过这个文件构建镜像 |
23 | 命令: docker build -f 文件路径 -t 镜像名:[tag] . |
24 | docker build -f mydockerfile-centos -t mycentos:0.1 . |
下面通过这个这个文件创建镜像
1 | docker build -f dockerfile-centos -t mycentos:0.1 . |
依次执行命令
最终返回Successfully表示成功
1 | docker run -it mycentos:0.1 # 版本号必须写,不然他会去找最新的 |
2 | pwd |
3 | vim |
4 | ifconfig |
这时可以看到这些功能都有了
可以通过查看docker构建历史
可以看到当前这个镜像是怎么一步一步构建起来的
我们平时拿到一个镜像也可以通过这个方法研究一下他是怎么做的
CMD与ENTRYPOINT
1 | CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 |
2 | ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 |
测试cmd
【视频书签,https://www.bilibili.com/video/BV1og4y1q7M4?p=29,雨终于停了,想去江边跑步】
1 | |
2 | FROM centos |
3 | CMD ["ls","-a"] # 启动centos展示目录 |
1 | 编写dockerfile文件 |
2 | vim dockerfile-test-cmd |
3 | FROM centos |
4 | CMD ["ls","-a"] # 启动后执行 ls -a 命令 |
5 | 构建镜像 |
6 | docker build -f dockerfile-test-cmd -t cmd-test:0.1 . |
7 | 运行镜像 |
8 | docker run cmd-test:0.1 # 由结果可得,运行后就执行了 ls -a 命令 |
9 | . |
10 | .. |
11 | .dockerenv |
12 | bin |
13 | dev |
14 | etc |
15 | home |
16 | |
17 | 想追加一个命令 -l 成为ls -al:展示列表详细数据 |
18 | docker run cmd-test:0.1 -l |
19 | docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": |
20 | executable file not found in $PATH": unknown. |
21 | ERRO[0000] error waiting for container: context canceled |
22 | cmd的情况下 -l 替换了CMD["ls","-l"] 而 -l 不是命令所以报错 |
测试ENTRYPOINT
run的时候可以直接加命令
Docker中许多命令都十分相似,我们需要了解他们的区别,最好的方式就是这样对比测试
1 | 编写dockerfile文件 |
2 | vim dockerfile-test-entrypoint |
3 | FROM centos |
4 | ENTRYPOINT ["ls","-a"] |
5 | 构建镜像 |
6 | docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 . |
7 | 运行镜像 |
8 | docker run entrypoint-test:0.1 |
9 | . |
10 | .. |
11 | .dockerenv |
12 | bin |
13 | dev |
14 | etc |
15 | home |
16 | lib |
17 | lib64 |
18 | lost+found ... |
19 | 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的 |
20 | docker run entrypoint-test:0.1 -l |
21 | total 56 |
22 | drwxr-xr-x 1 root root 4096 May 16 06:32 . |
23 | drwxr-xr-x 1 root root 4096 May 16 06:32 .. |
24 | -rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv |
25 | lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin |
26 | drwxr-xr-x 5 root root 340 May 16 06:32 dev |
27 | drwxr-xr-x 1 root root 4096 May 16 06:32 etc |
28 | drwxr-xr-x 2 root root 4096 May 11 2019 home |
29 | lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib |
30 | lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 .... |
实战Tomcat镜像
【视频书签,https://www.bilibili.com/video/BV1og4y1q7M4?p=30,这节有点长,这个jar包是哪来的,晚上再搞,先去该模型比较急,还有10节课,这周争取都看完】
- 准备镜像文件
准备tomcat 和 jdk 到当前目录,编写好README
- 编写dokerfile
1 | vim dockerfile |
2 | FROM centos # 基础镜像centos |
3 | MAINTAINER cao<1165680007@qq.com> # 作者 |
4 | COPY README /usr/local/README # 复制README文件 |
5 | ADD jdk-8u231-linux-x64.tar.gz /usr/local/ # 添加jdk,ADD 命令会自动解压 |
6 | ADD apache-tomcat-9.0.35.tar.gz /usr/local/ # 添加tomcat,ADD 命令会自动解压 |
7 | RUN yum -y install vim # 安装 vim 命令 |
8 | ENV MYPATH /usr/local # 环境变量设置 工作目录 |
9 | WORKDIR $MYPATH |
10 | ENV JAVA_HOME /usr/local/jdk1.8.0_231 # 环境变量: JAVA_HOME环境变量 |
11 | ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar |
12 | ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 # 环境变量: tomcat环境变量 |
13 | ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35 |
14 | 设置环境变量 分隔符是: |
15 | ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin |
16 | EXPOSE 8080 # 设置暴露的端口 |
17 | CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 设置默认命令 |
- 构建镜像
1 | 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件 |
2 | docker build -t mytomcat:0.1 . |
- run镜像
1 | -d:后台运行 -p:暴露端口 --name:别名 -v:绑定路径 |
2 | docker run -d -p 8080:8080 --name tomcat01 |
3 | -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test |
4 | -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1 |
- 访问测试
1 | docker exec -it 自定义容器的id /bin/bash |
2 | 访问测试 |
3 | cul localhost:8080 |
- 项目发布
(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
发布自己的镜像
发布到 Docker Hub
2、确定这个账号可以登录
3、登录
1 | docker login --help |
2 | Usage: docker login [OPTIONS] [SERVER] |
3 | Log in to a Docker registry. |
4 | If no server is specified, the default is defined by the daemon. |
5 | Options: |
6 | -p, --password string Password |
7 | --password-stdin Take the password from stdin |
8 | -u, --username string Username |
9 | docker login -u 你的用户名 -p 你的密码 |
- 提交 push镜像
1 | 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library |
2 | 解决方法: |
3 | 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了 |
4 | docker build -t kuangshen/mytomcat:0.1 . |
5 | 第二种 使用docker tag #然后再次push |
6 | docker tag 容器id kuangshen/mytomcat:1.0 #然后再次push |
7 | docker push kuangshen/mytomcat:1.0 |
发布到 阿里云镜像服务上
看官网 很详细https://cr.console.aliyun.com/repository/
1 | sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com |
2 | sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号] |
3 | 修改id 和 版本 |
4 | sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0 |
5 | 修改版本 |
6 | sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号] |
小结
Docker 网络
理解docker0
学习之前清空下前面的docker 镜像、容器
1 | 删除全部容器 |
2 | docker rm -f $(docker ps -aq) |
3 | 删除全部镜像 |
4 | docker rmi -f $(docker images -aq) |
测试
三个网络
问题: docker 是如果处理容器网络访问的?
1 | 测试 运行一个tomcat |
2 | docker run -d -P --name tomcat01 tomcat |
3 | 查看容器内部网络地址 |
4 | docker exec -it 容器id ip addr |
5 | |
6 | 发现容器启动的时候会得到一个 eth0@if91 ip地址,docker分配! |
7 | ip addr |
8 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 |
9 | link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 |
10 | inet 127.0.0.1/8 scope host lo |
11 | valid_lft forever preferred_lft forever |
12 | 261: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default |
13 | link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 |
14 | inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 |
15 | valid_lft forever preferred_lft forever |
16 | |
17 | |
18 | 思考? linux能不能ping通容器内部! 可以 容器内部可以ping通外界吗? 可以! |
19 | ping 172.18.0.2 |
20 | PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data. |
21 | 64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.069 ms |
22 | 64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.074 ms |
原理
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术!
https://www.cnblogs.com/bakari/p/10613710.html
再次测试 ip addr
再启动一个容器测试,发现又多了一对网络
1 | 我们发现这个容器带来网卡,都是一对对的 |
2 | veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连 |
3 | 正因为有这个特性 veth-pair 充当一个桥梁,连接各种虚拟网络设备的 |
4 | OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术 |
我们来测试下tomcat01和tomcat02是否可以ping通
1 | 获取tomcat01的ip 172.17.0.2 |
2 | docker-tomcat docker exec -it tomcat01 ip addr |
3 | 550: eth0@if551: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default |
4 | link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 |
5 | inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 |
6 | valid_lft forever preferred_lft forever |
7 | |
8 | 让tomcat02 ping tomcat01 |
9 | docker-tomcat docker exec -it tomcat02 ping 172.17.0.2 |
10 | PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. |
11 | 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.098 ms |
12 | 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.071 ms |
13 | 结论:容器和容器之间是可以互相ping通 |
网络模型图
结论:tomcat01和tomcat02公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
小结
Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了!
思考一个场景:我们编写了一个微服务,database url=ip: 项目不重启,数据ip换了,我们希望可以处理这个问题,可以通过名字来进行访问容器?
–-link
1 | docker exec -it tomcat02 ping tomca01 # ping不通 |
2 | ping: tomca01: Name or service not known |
3 | |
4 | 运行一个tomcat03 --link tomcat02 |
5 | docker run -d -P --name tomcat03 --link tomcat02 tomcat |
6 | 5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef |
7 | 3连接2 |
8 | 用tomcat03 ping tomcat02 可以ping通 |
9 | docker exec -it tomcat03 ping tomcat02 |
10 | PING tomcat02 (172.17.0.3) 56(84) bytes of data. |
11 | 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms |
12 | 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms |
13 | 2连接3 |
14 | 用tomcat02 ping tomcat03 ping不通 |
探究
docker network inspect 网络id 网段相同
docker inspect tomcat03
查看tomcat03里面的/etc/hosts发现有tomcat02的配置
–link 本质就是在hosts配置中添加映射
现在使用Docker已经不建议使用–link了!
自定义网络,不适用docker0!
docker0问题:不支持容器名连接访问!
自定义网络
1 | docker network |
2 | connect -- Connect a container to a network |
3 | create -- Creates a new network with a name specified by the |
4 | disconnect -- Disconnects a container from a network |
5 | inspect -- Displays detailed information on a network |
6 | ls -- Lists all the networks created by the user |
7 | prune -- Remove all unused networks |
8 | rm -- Deletes one or more networks |
查看所有的docker网络
网络模式
- bridge :桥接 docker(默认,自己创建也是用bridge模式)
- none :不配置网络,一般不用
- host :和所主机共享网络
- container :容器网络连通(用得少!局限很大)
测试
1 | 我们直接启动的命令 --net bridge,而这个就是我们得docker0 |
2 | bridge就是docker0 |
3 | docker run -d -P --name tomcat01 tomcat |
4 | 等价于 => docker run -d -P --name tomcat01 --net bridge tomcat |
5 | docker0,特点:默认,域名不能访问。 --link可以打通连接,但是很麻烦! |
6 | 我们可以 自定义一个网络 |
7 | docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet |
$ docker network inspect mynet;
启动两个tomcat,再次查看网络情况
在自定义的网络下,服务可以互相ping通,不用使用–link
我们自定义的网络docker当我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
- redis -不同的集群使用不同的网络,保证集群是安全和健康的
- mysql-不同的集群使用不同的网络,保证集群是安全和健康的
网络联通
1 | 测试两个不同的网络连通 再启动两个tomcat 使用默认网络,即docker0 |
2 | docker run -d -P --name tomcat01 tomcat |
3 | docker run -d -P --name tomcat02 tomcat |
4 | 此时ping不通 |
1 | 要将tomcat01 连通 tomcat—net-01 ,连通就是将 tomcat01加到 mynet网络 |
2 | 一个容器两个ip(tomcat01) |
1 | 01连通 ,加入后此时,已经可以tomcat01 和 tomcat-01-net ping通了 |
2 | 02是依旧不通的 |
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!
实战 部署redis 集群
1 | 创建网卡 |
2 | docker network create redis --subnet 172.38.0.0/16 |
3 | |
4 | 通过脚本创建六个redis配置 |
5 | for port in $(seq 1 6);\ |
6 | do \ |
7 | mkdir -p /mydata/redis/node-${port}/conf |
8 | touch /mydata/redis/node-${port}/conf/redis.conf |
9 | cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf |
10 | port 6379 |
11 | bind 0.0.0.0 |
12 | cluster-enabled yes |
13 | cluster-config-file nodes.conf |
14 | cluster-node-timeout 5000 |
15 | cluster-announce-ip 172.38.0.1${port} |
16 | cluster-announce-port 6379 |
17 | cluster-announce-bus-port 16379 |
18 | appendonly yes |
19 | EOF |
20 | done |
21 | |
22 | 通过脚本运行六个redis |
23 | for port in $(seq 1 6);\ |
24 | docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} \ |
25 | -v /mydata/redis/node-${port}/data:/data \ |
26 | -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ |
27 | -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf |
28 | docker exec -it redis-1 /bin/sh #redis默认没有bash |
29 | redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1 |
docker搭建redis集群完成!
我们使用docker之后,所有的技术都会慢慢变得简单起来!
SpringBoot微服务打包Docker镜像
1、构建SpringBoot项目
2、打包运行
1 | mvn package |
3、编写dockerfile
1 | FROM java:8 |
2 | COPY *.jar /app.jar |
3 | CMD ["--server.port=8080"] |
4 | EXPOSE 8080 |
5 | ENTRYPOINT ["java","-jar","app.jar"] |
4、构建镜像
1 | 1.复制jar和DockerFIle到服务器 |
2 | 2.构建镜像 |
3 | docker build -t xxxxx:xx . |
5、发布运行
以后我们使用了Docker之后,给别人交付就是一个镜像即可!
IDEA整合Docker
Docker 整合Docker
Docker Compose
Docker Swarm
各种bug
Xshell链接失败
1 | Connecting to 192.168.147.131:22... |
2 | Could not connect to '192.168.147.131' (port 22): Connection failed. |
注:电脑休眠重启后,机子会断开,要重新在vmware里面输入ip addr 获得ip
修改xshell中的主机接口即可
![image-20200616200505065](/zbcn.github.io/assets/postImg/docker/Docker.assets/image-20200616200505065.png