Docker基础学习
Docker的安装
查看linux版本
uname -r
查看内核版本
cat /etc/os-release
获取linux的详细信息
开始安装
-
要安装 Docker Engine,你需要一个 CentOS 7或8的维护版本。必须启用 centos-extras 存储库。这个存储库默认是启用的,但是如果您已经禁用了它,您需要重新启用它。建议使用 overlay2存储驱动程序。
-
参考官网
-
安装之前卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装存储库
# 安装安装包
sudo yum install -y yum-utils
# 安装docker镜像 国外的
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 【建议】 国内阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker
# 安装之前更新索引
yum makecache fast
# 安装docker相关的 ce社区版的 ee企业版的
yum install docker-ce docker-ce-cli containerd.io
- 启动docker
# 启动docker
systemctl start docker
- 查看版本
docker version
- 运行helloworld 检查是否可用
docker run hello-world
- 查看docker镜像
docker images
- 卸载docker
-
卸载 Docker Engine、 CLI 和 Containerd 软件包:
$ sudo yum remove docker-ce docker-ce-cli containerd.io
-
主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有图像、容器和卷:
$ sudo rm -rf /var/lib/docker $ sudo rm -rf /var/lib/containerd
配置阿里云镜像加速
- 登录阿里云账号
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://nwucfehd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker查找镜像流程
底层原理
常用命令
官网 https://docs.docker.com/engine/reference/commandline/docker/
帮助命令
docker version # 查看docker版本
docker info # 查看docker的详细信息
docker 命令 --help # 查看帮助文档
镜像命令
[root@ansible-02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 3 months ago 13.3kB
REPOSITORY # 镜像源
TAG #镜像标签
IMAGE ID #镜像ID
CREATED # 镜像创建时间
SIZE #镜像大小
# 可选项
-a, --all # 查看所有镜像
-q, --quiet #只显示镜像id
搜索镜像命令
# 搜索镜像
docker search 镜像名
# 参数
--filter , -f #基于提供的条件的过滤器输出 可以通过stars过滤
--format #使用 Go 模板进行漂亮印刷的搜索
--limit 25 #搜寻结果的最大数目
--no-trunc #不要截断输出
也可到官网搜索 https://hub.docker.com/search?q=mysql&type=image
- 过滤stars3000以上的
docker search mysql --filter=stars=3000
- 过滤stars3000以上的 并且内容描述设置为不可截断
docker search --no-trunc mysql --filter=stars=3000
-
--limit
是搜索返回的最大结果数。这个值可以在1到100之间。-- limit 的默认值为25。 -
过滤
-
过滤标志(- f 或 -- filter)格式是一个
key = value
对。如果有多个过滤器,则传递多个标志(例如 -- filter is-automated = true -- filter stars = 3)目前支持的过滤器有:
-
stars (int - number of stars the image has) 收藏数量
-
is-automated (boolean - true or false) - 是否为自动构建的 true、false
-
is-official (boolean - true or false) -是否为正式的(官方版本) true、false
-
# 过滤是自动构建的 busybox
docker search --no-trunc busybox --filter is-automated=true
拉取镜像命令
[root@ansible-02 ~]# docker pull mysql
Using default tag: latest # 没有指定标签默认从latest拉取
latest: Pulling from library/mysql
69692152171a: Pull complete # 分层下载,dockerimages的核心,联合文件系统
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
f7fddf10c2c2: Pull complete
16415d159dfb: Pull complete
0e530ffc6b73: Pull complete
b0a4a1a77178: Pull complete
cd90f92aa9ef: Pull complete
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
[root@ansible-02 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
69692152171a: Already exists # 已经存在的图层 不在重复下载
1651b0be3df3: Already exists
951da7386bc8: Already exists
0f86c95aa242: Already exists
37ba2d8bd4fe: Already exists
6d278bb05e94: Already exists
497efbd93a3e: Already exists
a023ae82eef5: Pull complete
e76c35f20ee7: Pull complete
e887524d2ef9: Pull complete
ccb65627e1c3: Pull complete
Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
Docker 图像可以由多个图层组成。在上面的例子中,图像由12个图层组成
图层可以通过图像重复使用。例如,mysql:latest 和mysql:5.7共享几个图层。已经存在的图层就不再下载
- 使用
docker images
查看所有镜像
-
Docker 使用内容寻址的图像存储,图像 ID 是一个 SHA256摘要,涵盖了图像的配置和层。
-
在拉取完成后,Docker 打印图像的摘要。在上面的例子中,图像的摘要是:
sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
-
可以通过sha256获取镜像
docker pull mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
-
docker pull -all-tags images # 拉取所有版本的该镜像
关于更多拉取镜像的操作参考官网 https://docs.docker.com/engine/reference/commandline/pull/
删除镜像
-
docker rmi [OPTIONS] IMAGE [IMAGE...]
-
描述
-
从主机节点移除(和取消标记)一个或多个图像。如果一个图像有多个标记,使用此命令并将标记作为参数只删除标记。如果标记是图像的唯一标记,则图像和标记都将被删除。
这不会从注册表中删除图像。除非使用-f 选项,否则无法删除正在运行的容器的映像。要查看主机上的所有图像,请使用 docker image ls 命令。
例如使用这个命令,请参考下面的示例部分。
-
-
参数
姓名,速记 | 违约 | 描述 |
---|---|---|
--force , -f |
强制删除图像 | |
--no-prune |
不要删除无标签 |
- 操作
[root@ansible-02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 2c9028880e58 5 weeks ago 447MB
mysql latest c0cdc95609f1 5 weeks ago 556MB
hello-world latest d1165f221234 3 months ago 13.3kB
# 通过标签删除
[root@ansible-02 ~]# docker rmi mysql:latest
Untagged: mysql:latest
Untagged: mysql@sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Deleted: sha256:c0cdc95609f1fc1daf2c7cae05ebd6adcf7b5c614b4f424949554a24012e3c09
Deleted: sha256:137bebc5ea278e61127e13cc7312fd83874cd19e392ee87252b532f0162fbd56
Deleted: sha256:7ed0de2ad4e43c97f58fa9e81fba73700167ef9f8a9970685059e0109749a56b
Deleted: sha256:9375660fbff871cd29c86b8643be60e376bfc96e99a3d7e8f93d74cd61500705
Deleted: sha256:d8a47065d005ac34d81017677330ce096eb5562eeb971e2db12b0e200fdb1cb6
Deleted: sha256:ca13c8ad9df5d824d5a259a927eaa6c04a60f022bc2abe8fc7866cf4b2b366f4
# 通过ID删除
[root@ansible-02 ~]# docker rmi 2c9028880e58
Untagged: mysql:5.7
Untagged: mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Deleted: sha256:2c9028880e5814e8923c278d7e2059f9066d56608a21cd3f83a01e3337bacd68
Deleted: sha256:c49c5c776f1bc87cdfff451ef39ce16a1ef45829e10203f4d9a153a6889ec15e
Deleted: sha256:8345316eca77700e62470611446529113579712a787d356e5c8656a41c244aee
Deleted: sha256:8ae51b87111404bd3e3bde4115ea2fe3fd2bb2cf67158460423c361a24df156b
Deleted: sha256:9d5afda6f6dcf8dd59aef5c02099f1d3b3b0c9ae4f2bb7a61627613e8cdfe562
Deleted: sha256:7af1865d5c19316c3dc0829a2ee2b3a744ae756f7fec9c213d3afc5f1f6ed306
Deleted: sha256:f205c8f3c8aaa6376442b34c0c2062738461d37e0aa16ba021cd7e09c67213c2
Deleted: sha256:d690e8a8242cf13cbe98c5b2faffdd0fc7e6c4c13425b5da31de991aa1f89a76
Deleted: sha256:24efeee958e9f3d859fe15540e9296d5aaa6d3eb3b5f5494a2e8370608a4cfaa
Deleted: sha256:654f2ffede3bb536fd62d04c9c7b7826e890828bec92182634e38684959b2498
Deleted: sha256:de478a06eaa676052e665faa0b07d86a007f4b87cf82eb46a258742dc2d32260
Deleted: sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33
# 删除全部容器
[root@ansible-02 ~]# docker rmi -f $(docker images -aq)
Untagged: hello-world:latest
Untagged: hello-world@sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
#再次查看镜像
[root@ansible-02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
#也可以使用图像sha256删除 删除注册表localhost:5000/test/busybox上面的busybox镜像
docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
容器命令
- 下载镜像
docker pull centos
- 运行容器
# 参数
docker run [可选参数] image
# 参数说明
--name=“Name” 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-p 随机指定端口
# 测试,启动并进入容器
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -it centos /bin/bash
[root@74e82b7980e7 /]# ls # 查看容器内的centos,基础版本,很多命令是不完善的
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
# 从容器中退回主机
[root@77969f5dcbf9 /]# exit
exit
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# ls
bin dev fanfan lib lost+found mnt proc run srv tmp var
boot etc home lib64 media opt root sbin sys usr
- 列出所有正在运行的容器
# docker ps 命令
# 列出当前正在运行的容器
-a # 列出正在运行的容器包括历史容器
-n=? # 显示最近创建的容器
-q # 只显示当前容器的编号
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77969f5dcbf9 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago xenodochial_bose
74e82b7980e7 centos "/bin/bash" 16 minutes ago Exited (0) 6 minutes ago silly_cori
a57250395804 bf756fb1ae65 "/hello" 7 hours ago Exited (0) 7 hours ago elated_nash
392d674f4f18 bf756fb1ae65 "/hello" 8 hours ago Exited (0) 8 hours ago distracted_mcnulty
571d1bc0e8e8 bf756fb1ae65 "/hello" 23 hours ago Exited (0) 23 hours ago magical_burnell
[root@iZ2zeg4ytp0whqtmxbsqiiZ /]# docker ps -qa
77969f5dcbf9
74e82b7980e7
a57250395804
392d674f4f18
571d1bc0e8e8
- 退出容器
exit # 直接退出容器并关闭
Ctrl + P + Q # 容器不关闭退出
#再次进入容器
docker attach 容器id
- 删除容器
docker rm -f 容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -q|xargs docker rm -f # 删除所有的容器
- 启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前的容器
- 关于run的更多参数和应用参考 https://docs.docker.com/engine/reference/commandline/run/
常用的其他命令
- 后台启动命令
[root@ansible-02 ~]# docker run -d centos
7ae90e5c110f83d7933d444cc8e28ce038daa18ba41965f2b476fc5909c64d0e
# 使用docker ps查看 发现docker启动后自动关闭了
[root@ansible-02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx, 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
- 查看日志
docker logs -tf --tail number 容器id
[root@ansible-02 ~]# docker logs -tf --tail 1 c0323115eb62
2021-06-17T05:05:45.901449914Z [root@c0323115eb62 /]# exit # 日志输出
#自己编写一个脚本执行
[root@ansible-02 ~]# docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done"
04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200
#查看容器进程 发现已经启动
[root@ansible-02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04046d3a81a9 centos "/bin/sh -c 'while t…" 50 seconds ago Up 49 seconds kind_lichterman
#查看日志信息 发现正在打印 hello world
[root@ansible-02 ~]# docker logs -tf --tail 10 04046d3a81a9
2021-06-17T05:15:17.936138823Z hello world
2021-06-17T05:15:18.940434219Z hello world
2021-06-17T05:15:19.946570935Z hello world
2021-06-17T05:15:20.973001329Z hello world
2021-06-17T05:15:21.991633882Z hello world
2021-06-17T05:15:22.999685978Z hello world
2021-06-17T05:15:24.004549161Z hello world
2021-06-17T05:15:25.008258675Z hello world
2021-06-17T05:15:26.047740981Z hello world
- 查看容器中进程信息
[root@ansible-02 ~]# docker top 04046d3a81a9
UID PID PPID C STIME TTY TIME CMD
root 14872 14851 0 22:13 ? 00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done
root 15355 14872 0 22:16 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
- 查看镜像的元数据
[root@ansible-02 ~]# docker inspect 04046d3a81a9
[
{
"Id": "04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200",
"Created": "2021-06-17T05:13:12.62892884Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hello world;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 14872,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-06-17T05:13:13.000698631Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/hostname",
"HostsPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/hosts",
"LogPath": "/var/lib/docker/containers/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200/04046d3a81a91eb2f4c732c3f8acecdc6cf12fa3ed43db2a92f4de3368a59200-json.log",
"Name": "/kind_lichterman",
"RestartCount": 0,
"Driver": "overlay2",
- - -- -- - - -- - - - -
- 进入当前正在运行中的容器
# 我们通过后台启动容器的方式运行的 需要进入容器 修改一些配置
# 命令
docker exec -it 容器id /bin/bash
# 进入docker容器
[root@ansible-02 ~]# docker exec -it 04046d3a81a9 /bin/bash
[root@04046d3a81a9 /]#
[root@04046d3a81a9 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@04046d3a81a9 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 05:13 ? 00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done
root 626 0 0 05:23 pts/0 00:00:00 /bin/bash
root 1106 0 0 05:31 pts/1 00:00:00 /bin/bash
root 1151 1 0 05:31 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 1152 1106 0 05:31 pts/1 00:00:00 ps -ef
# 方式二
docker attach 容器id
# docker exec # 进入容器后开启一个新的终端,可以在里面操作
# docker attach # 进入容器正在执行的终端,不会启动新的进程
- 拷贝文件 从容器到主机
# 再容器上创建一个文件
[root@04046d3a81a9 home]# touch test.java
[root@04046d3a81a9 home]# ls
test.java
# 将文件拷贝到当前目录下
[root@ansible-02 ~]# docker cp 04046d3a81a9:/home/test.java ./
[root@ansible-02 ~]# ll
total 12
-rw-------. 1 root root 2769 May 31 17:16 anaconda-ks.cfg
-rw-r--r--. 1 root root 2777 May 31 17:22 initial-setup-ks.cfg
-rw-------. 1 root root 2049 May 31 17:16 original-ks.cfg
-rw-r--r-- 1 root root 0 Jun 16 22:36 test.java
小结
作业
安装nginx
# 直接下再并启动容器
# 这里指定本地端口为 3344 而容器中nginx的启动端口为 80 名字为nginx01
[root@ansible-02 ~]# docker run -d --name nginx01 -p 3344:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
69692152171a: Pull complete
30afc0b18f67: Pull complete
596b1d696923: Pull complete
febe5bd23e98: Pull complete
8283eee92e2f: Pull complete
351ad75a6cfa: Pull complete
Digest: sha256:6d75c99af15565a301e48297fa2d121e15d80ad526f8369c526324f0f7ccb750
Status: Downloaded newer image for nginx:latest
091bc111846110a9de6ce27a5071e1b757168a7610741b441dcb3b71c35f83a2
# 查看本地镜像
[root@ansible-02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest d1a364dc548d 3 weeks ago 133MB
centos latest 300e315adb2f 6 months ago 209MB
# 查看容器是否启动
[root@ansible-02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
091bc1118461 nginx "/docker-entrypoint.…" 25 seconds ago Up 24 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
04046d3a81a9 centos "/bin/sh -c 'while t…" 36 minutes ago Up 36 minutes kind_lichterman
- 打开浏览器访问 3344端口
- 进入容器内部 查看nginx安装位置
root@091bc1118461:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@091bc1118461:/# cd /etc/nginx/
root@091bc1118461:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
- 域名映射关系图
安装Tomcat
- 下载镜像并启动容器
# --rm 参数指 关闭容器后删除容器
[root@ansible-02 ~]# docker run -it --rm -p 8888:8080 tomcat:9.0
# 进入tomcat容器中
[root@ansible-02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4248714095fd tomcat:9.0 "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp upbeat_austin
091bc1118461 nginx "/docker-entrypoint.…" 25 minutes ago Up 25 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
04046d3a81a9 centos "/bin/sh -c 'while t…" About an hour ago Up About an hour kind_lichterman
# 进入容器中
[root@ansible-02 ~]# docker exec -it 4248714095fd /bin/bash
# 查看安装目录
root@4248714095fd:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@4248714095fd:/usr/local/tomcat# cd webapps
root@4248714095fd:/usr/local/tomcat/webapps# ls
# 发现问题:1.linux命令少了, 2. webapps下内容为空,阿里云净吸纳过默认是最小的镜像,所有不必要的都剔除了,保证最小可运行环境即可
# webapps的原始内容其实是在webapps.dist中 然后将webapps.dist复制到webapps就可以了
root@4248714095fd:/usr/local/tomcat# cd webapps
root@4248714095fd:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
- 访问页面
安装es+Kibana
- 安装es
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录! 挂载
# --net somenetwork 网络配置
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 测试
[root@ansible-02 ~]# curl localhost:9200
{
"name" : "8cba692312bd",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "L2XkftBhR9u0wKVmOmgVZQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
# 限制大小
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
- 监视状态
dockter stats
- 更改内存后重新查看 cpu性能
可视化工具
- portainer(先用这个)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- 访问浏览器 8088端口
Docker镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝
- 自己制作一个镜像DockerFile
Docker镜像加载原理
UnionFS(联合文件系统)
下载的时候看到的一层层就是这个。
UnionFS(联合文件系统)∶Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into asinglevirtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性∶一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
- bootfs(boot ilesystem)主要包含bootloader和kerne,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由botfs转交给内核,此时系统也会卸载bootfs。[个人理解:bootfs用于开机,rootfs用于命令。]
- rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/de,/proc,/bin,/etc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
为什么虚拟机很大,Docker很小?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs
基本是一致的,rootfs
会有差别,因此不同的发行版可以公用bootfs。
虚拟机是分钟级别,容器是秒级!
分层理解
理解:
所有的Docker┌镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于UbuntuLinux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfiter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW【1】.
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
举例
- 这里我们拉取一个redis镜像
[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
69692152171a: Pull complete
a4a46f2fd7e0: Pull complete
bcdf6fddc3bd: Pull complete
2902e41faefa: Pull complete
df3e1d63cdb1: Pull complete
fa57f005a60d: Pull complete
Digest: sha256:7e2c6181ad5c425443b56c7c73a9cd6df24a122345847d1ea9bb86a5afc76325
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
# 可以看出他是分6层进行下载
- 我们看一下该镜像的详细信息
[root@localhost ~]# docker inspect redis
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33",
"sha256:ec5652c3523d96657d66169c0eb71b572ff065711c705a15ec02f60a21c212c3",
"sha256:76d3e24d63f60e6a73af70be15959eb4021dd7a5a09da6925037d3b4a1673fca",
"sha256:f06719b0aa43029f32c821c8f14f9f5941a8be6d3b61dcd9f3f884b39e9a4f23",
"sha256:b896f490f2edc62cc9d190465bbeab871619590d1e9beeffb92e4ca9cc08116d",
"sha256:e3f4077f577bf07c0940d6345ddd17014ff824d3f4f7f3effc9a8c4dae3e527b"
]
},
# 可以看到他是分6层进行下载
特点
- Docker镜像都是只读的 当启动容器的时候在该镜像上创建一层(容器),所有的操作都是在容器中进行的
- 总结
Commit镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
实例
# 首先从网上pull一个tomcat 并运行
[root@localhost ~]# docker run -it -p 8080:80 tomcat /bin/bash
root@c212dc8abb8b:/usr/local/tomcat# cp -r webapps.dist/* webapps/
root@c212dc8abb8b:/usr/local/tomcat# cd webapps
root@c212dc8abb8b:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
# 然后将当前已将创建好的镜像重新发布
[root@localhost ~]# docker commit -a="the" -m="add webapps" tomcat01 tomcat02:1.0
sha256:839df4265ee7f101b3dce48d332aa7adb7ef45e4c0923b9cdd08a0228face070
# 查看镜像 发布成功
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 839df4265ee7 14 seconds ago 672MB
tomcat latest 5505f7218e4d 28 hours ago 667MB
redis latest fad0ee7e917a 2 weeks ago 105MB
容器数据卷
什么是容器数据卷
Docker的理念回顾
将应用和服务打包成一个镜像
如果数据都在容器中,如果我们删除容器,数据就会永久丢失, 需求:数据持节化
Mysql,容器删了,删库跑路! 需求: 将数据持节化到本地
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结: 卷技术可以实现容器和本地Linux之间数据的同步化,也可以实现容器之间的数据同步。数据共享
实例
# 下载并启动centos 并-v启动卷同步
[root@localhost ~]# docker run -it --name centos01 -v /home/test:/home centos
# 查看容器信息
[root@localhost home]# docker inspect de62d0531ee2
"Mounts": [
{
"Type": "bind",
"Source": "/home/test", # 主机linux挂在目录
"Destination": "/home", # 容器同步目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
- 测试创建一个新文件 是一个双向的过程
实战
安装mysql
# 运行容器,需要做数据挂载,安装启动mysql,需要配置密码
# 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名称
# 安装启动mysql 并设置密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/mysql.cnf -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
- 测试 创建一个新的数据库 test
具名和匿名
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径,也没有指定名!
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local c1280dd0e57a792d0c74d01c46edea18e92d46415a2d49c026f6fe5efce4808e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
efb31bfdfc07 nginx "/docker-entrypoint.…" 42 seconds ago Up 40 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx01
0758f4a25cee mysql:5.7 "docker-entrypoint.s…" 41 hours ago Up 41 hours 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql02
de62d0531ee2 centos "/bin/bash" 44 hours ago Up 44 hours centos01
# 使用具名的方式创建
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
f7422866990f04b21635e627e7fdf97781a451a5dfeae43db3ee15c775b679fd
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local c1280dd0e57a792d0c74d01c46edea18e92d46415a2d49c026f6fe5efce4808e
local juming-nginx
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7422866990f nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 0.0.0.0:49154->80/tcp, :::49154->80/tcp nginx02
efb31bfdfc07 nginx "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx01
0758f4a25cee mysql:5.7 "docker-entrypoint.s…" 41 hours ago Up 41 hours 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql02
de62d0531ee2 centos "/bin/bash" 44 hours ago Up 44 hours centos01
- 查看一下这个卷
- 查看目录
[root@localhost _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
拓展
# 通过 -v 容器内容路径 ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作
初实DockerFile
DockerFIle就是用来构建与Docker镜像之间同步文件的!命令脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
# 创建一个dockerfile文件, 名字可以随机
# 文件的内容 指定(大写) 参数
FROM centos
VOLUME ["/volume01", "/volume02"]
CMD echo "----end----"
CMD /bin/bash
# 这里的每一个命令都是镜像的一层!
- 构建自己的镜像
- 查看镜像
- 启动自己的镜像
[root@localhost test]# docker run -it test/centos:1.4 /bin/bash
- 检查下目录
- 这个卷一定在本机有一个对应的目录
- 查看卷挂载目录
docker inspect 容器id
- 查看卷挂载目录
测试一下刚才的文件是否同步到主机上了!
这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
数据卷容器
- 创建docker01并查看
docker run -it --name docker01 test/centos:1.4 /bin/bash
-
创建
docker02
并指定数据卷来自docker01
-
docker run -it --name docker02 --volumes-from docker01 test/centos:1.4 /bin/bash
-
查看目录
-
- 现在在一中创建一个文件
test
在docker02
中查看 发现存在
多个mysql同步
多个mysql同步的原理是和上面的相同的
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZ2zeg4ytp0whqtmxbsqiiZ home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论
容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
DockerFile
dockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤
- 编写一个dockerFile文件
2.docker build 构建成为一个镜像
-
docker run 运行镜像
-
docker push 发布镜像(DockerHub、阿里云镜像)
DockerFile的构建过程
基础知识:
- 每个保留关键字(指令)都是必须大写字母
- 执行从上到下顺序执行
#
表示注释- 每个指令都会创建提交一个新的镜像层,并提交!
dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!
Docker镜像逐渐成为企业的交互标准,必须要掌握!
步骤:开发,部署, 运维..... 缺一不可!
DockerFile: 构建文件, 定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
DockerFile指令说明
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
创建自己的镜像
[root@localhost dockerfile-test]# cat dockerfile-centos
FROM centos
# 填写作者名 和 邮箱
MAINTAINER zgrey<1234544@qq.com>
ENV MYPATH /usr/local
# 镜像的工作目录
WORKDIR $MYPATH
# 安装vim
RUN yum -y install vim
# 安装 ifconfig
RUN yum -y install net-tools
# 暴露80端口
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
# 安装dockerfile
[root@localhost dockerfile-test]# docker build -f dockerfile-centos -t mycentos:1.0 .
Successfully built 36f2bc353613
Successfully tagged mycentos:1.0
- 启动容器并查看
[root@localhost dockerfile-test]# docker run --name mycentos01 -it mycentos:1.0 /bin/bash
[root@0db7ed0f20ee local]# pwd
/usr/local # 镜像开启默认在工作目录
- 可以使用ifconfig
- 可以使用vim
- 查看本地运行的变更历史
[root@localhost test]# docker history mycentos:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
ee5e440eee89 3 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
8bb709dc586a 3 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
2d21b0150f3e 3 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
73219a337451 3 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0dafd1e7d6ae 3 minutes ago /bin/sh -c yum -y install net-tools 25MB
477a50205a00 3 minutes ago /bin/sh -c yum -y install vim 60.7MB
a07bb528fbb3 4 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
a921a2bc7168 4 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
b3dc1e4e20d9 4 minutes ago /bin/sh -c #(nop) MAINTAINER zgrey<1234544@… 0B
300e315adb2f 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD 和ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
- 测试CMD
# 1. 编写dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls", "-a"]
# 2. 构建镜像
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
# 3. run运行, 发现我们的ls -a 命令生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
# 想追加一个命令 -l 变成 ls -al
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run ebe6a52bb125 ls -l
# cmd的情况下 -l替换了CMD["ls", "-a"]命令, -l不是命令,所以报错了
- 测试ENTRYPOINT
# 1. 编写dockerfile文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]
# 2. 构建文件
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test .
# 3. run运行 发现我们的ls -a 命令同样生效
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib
# 4. 我们的追加命令, 是直接拼接到ENTRYPOINT命令的后面的!
[root@iZ2zeg4ytp0whqtmxbsqiiZ dockerfile]# docker run entrypoint-test -l
total 56
drwxr-xr-x 1 root root 4096 Aug 13 07:52 .
drwxr-xr-x 1 root root 4096 Aug 13 07:52 ..
-rwxr-xr-x 1 root root 0 Aug 13 07:52 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Aug 13 07:52 dev
drwxr-xr-x 1 root root 4096 Aug 13 07:52 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost+found
Docker制作Tomcat镜像
- 编辑配置文件
[root@localhost myTomcat]# cat Dockerfile
FROM centos
MAINTAINER zgrey<123123@qq.com>
ADD apache-tomcat-7.0.75.tar.gz /usr/local/
ADD jdk-8u121-linux-x64.tar.gz /usr/local/
RUN yum -y install vim
RUN yum -y install net-tools
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV JAVA_HOME /usr/local/jdk1.8.0_73
#ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
#ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
#ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
ENV PATH $PATH:$JAVA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-7.0.75/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.75/bin/logs/catalina.out
- 构建镜像
[root@localhost myTomcat]# docker build -t mytomcat:1.0 .
- 启动容器
docker run -it -p 3344:8080 --name mytomcat -v /home/myTomcat/test:/usr/local/apache-tomcat-7.0.75/webapps/test -v /home/myTomcat/logs:/usr/local/apache-tomcat-7.0.75/logs mytomcat:1.0 /bin/bash
# 查看目录
[root@148f76894978 local]# ls
apache-tomcat-7.0.75 bin etc games include jdk1.8.0_121 lib lib64 libexec sbin share src
- 在主机中进入日志文件中查看
- 由于我们将webapps目录同步到了本地所以直接在本地test目录中发布就可以
发布到DockerHub
- 登录DockerHub
[root@localhost test]# docker login -u uikka
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 发布到远程
[root@localhost test]# docker push mytomcat:1.0
The push refers to repository [docker.io/library/mytomcat]
9376e126d001: Preparing
e778d6435992: Preparing
e09ab34b1e6e: Preparing
ed8ab35cfeb4: Preparing
2653d992f4ef: Preparing
denied: requested access to the resource is denied # 拒绝
# 解决 更改一下tag
[root@localhost test]# docker tag a041614d7458 uikka/mytomcat:1.0
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 a041614d7458 20 minutes ago 679MB
uikka/mytomcat 1.0 a041614d7458 20 minutes ago 679MB
mycentos 1.0 ee5e440eee89 2 hours ago 295MB
test/centos 1.4 200025508191 5 hours ago 209MB
test/centos 1.0 4cfac7a8a5b6 5 hours ago 209MB
test/centos 1.2 4cfac7a8a5b6 5 hours ago 209MB
test/centos 1.3 4cfac7a8a5b6 5 hours ago 209MB
tomcat02 1.0 839df4265ee7 2 days ago 672MB
tomcat latest 5505f7218e4d 3 days ago 667MB
redis latest fad0ee7e917a 2 weeks ago 105MB
nginx latest d1a364dc548d 3 weeks ago 133MB
mysql 5.7 2c9028880e58 5 weeks ago 447MB
centos latest 300e315adb2f 6 months ago 209MB
[root@localhost test]# docker push uikka/mytomcat:1.0
The push refers to repository [docker.io/uikka/mytomcat]
9376e126d001: Pushing [===> ] 1.574MB/24.97MB
e778d6435992: Pushing [=> ] 2.221MB/60.68MB
e09ab34b1e6e: Pushing [> ] 1.598MB/370.1MB
ed8ab35cfeb4: Pushing [==========> ] 2.83MB/13.71MB
2653d992f4ef: Pushing [=> ] 5.471MB/209.3MB
# 提交的话也是分层来的
#成功!!!
发布到阿里云镜像服务
- 登录阿里云 创建一个个人实例
- 创建一个命名空间
- 创建一个本地私有仓库
- 登录阿里云
[root@localhost test]# docker login --username=jh0125*** registry.cn-shenzhen.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 从Registry中拉取镜像
$ docker pull registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
- 推送镜像
$ docker login --username=jh0125**** registry.cn-shenzhen.aliyuncs.com
$ docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
$ docker push registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:[镜像版本号]
测试
[root@localhost test]# docker tag a041614d7458 registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:1.0
[root@localhost test]# docker push registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey:1.0
The push refers to repository [registry.cn-shenzhen.aliyuncs.com/ali-zgrey/native-zgrey]
9376e126d001: Pushed
e778d6435992: Pushed
e09ab34b1e6e: Pushed
ed8ab35cfeb4: Pushed
2653d992f4ef: Pushed
1.0: digest: sha256:f892298ad851cb1234b56a61e2a6fa6b7d7491e47618f3db798b9e3b51431fc9 size: 1377
小结