Docker学习
内核是3.1以上的
[root@localhost ~] # uname -r
5.14.0-427.13.1.el9_4.x86_64
docker开机自启动
docker update --restart=always 镜像id
系统版本
[root@localhost ~]# hostnamectl
Static hostname: (unset)
Transient hostname: localhost
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: 1694271944ed4bceac37a8515cd424ba
Boot ID: fda9b39bba374c9c9a09aab8d860bdd2
Virtualization: vmware
Operating System: Rocky Linux 9.4 (Blue Onyx)
CPE OS Name: cpe:/o:rocky:rocky:9::baseos
Kernel: Linux 5.14.0-427.13.1.el9_4.x86_64
Architecture: x86-64
Hardware Vendor: VMware, Inc.
Hardware Model: VMware20,1
Firmware Version: VMW201.00V.21805430.B64.230522183
安装Docker
1 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
podman \
runc
# 2 需要的安装包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3 设置镜像仓库 (设置阿里开源镜像仓库地址)
# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[[更新yum软件包索引]]
yum makecache
# 4 安装新版Docker相关源
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 5 启动docer
systemctl start docker
开机启动
systemctl enable docker
# 6 测试Docker
docker run hello-world
# 7 查看下载的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 12 months ago 13.3k
debian安装docker
sudo apt update
sudo apt install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker version
了解卸载镜像
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
# 2. 删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
## 阿里云镜像加速
~~~css
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://77ut5a7j.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker的常用命令
帮助命令
docker version [[版本信息]]
docker info [[系统信息(包括镜像和容器)]]
docker 命令 --help [[万能命令]] 帮助
查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 12 months ago 13.3kB
[[解释]]
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
[[可选项]]
-a, --all [[列出所有镜像]]
-f, --filter filter [[过滤(不经常用)]]
-q, --quiet [[只显示镜像id]]
-aq [[也是只显示镜像id]]
搜索镜像
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL
mysql MySQL is a widely used, open-source relation… 15079 [OK]
mariadb MariaDB Server is a high performing open sou… 5749 [OK]
percona Percona Server is a fork of the MySQL relati… 628 [OK]
[[解释]]
-f (filter) [[过滤]]
search [[搜索]]
name [[镜像名字]]
description [[描述]]
stars [[点赞]]
下载镜像 docker pull (镜像名字) tag(版本)
[root@localhost ~]# docker pull mysql
Using default tag: latest [[如果不写TAG]] 默认最新版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete [[分层下载]] docker image的核心 联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 [[签名]]
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest [[真实地址]]
docker pull mysql==docker.io/library/mysql:latest [[等价]]
[root@localhost ~]# docker pull mysql:5.7 [[指定5]].7版本
5.7: Pulling from library/mysql #5.7版本
72a69066d2fe: Already exists [[分层可公用]]
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete #5.7分层
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
删除镜像
docker rmi 容器ID/容器名字 [[删除指定容器]]
docker rmi -f 容器ID/容器名字 [[删除多个容器]]
[root@localhost ~]docker rmi -f $(docker images -aq) # $查出镜像id 递归删除
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos [[下载一个centos]]
新建容器并启动
docker run [可选参数] image
[[参数说明]]
--name="name" [[容器名字]] 用来区分容器
-d [[后台方式运行]]
-it [[交互方式运行]] 进入容器查看内容
-P [[指定容器端口]] 8080 (大写)
-p 主机端口:容器端口
-p 容器端口:容器端口
-p [[随机指定端口]] (小写)
测试
[root@localhost ~]# docker run -it centos /bin/bash (启动并进入容器)
[root@e1bc46bb8833 /]# ls [[查看容器内的centos]] 基础版本 命令不完善
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@e1bc46bb8833 /]# exit
exit
[root@localhost ~]# (退出容器不运行)
-it [[以交互模式运行容器,通常于-t一起使用]]
-i: [[以交互模式运行容器,通常于-t一起使用]]
-t: [[为容器重新分配一个伪输入终端,通常于-i一起使用]]
-d: [[后台运行容器,并返回容器ID;]]
-P: [[随机端口映射,容器内部端口随机映射到主机的端口]]
-p: [[指定端口映射,格式为:主机]](宿主)端口:容器端口
列出运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-a [[列出当前正在运行的容器--(顺带带出历史运行的容器)]]
-n=x(数字) [[显示最近创建的容器]]
-q [[只显示容器的编号]]
-aq [[显示当前容器的编号(顺带历史运行)]]
exis [[直接停止并退出]]
ctrl+p+q [[容器不停止退出]]
删除运行容器
docker rm 容器id [[删除指定容器]] 不能删除正在运行的容 如果要强制删除 rm -f
docker rm -f $(docker ps -aq) [[删除所有]]
docker ps -a -q|xarfs docker rm [[删除所有容器]]
启动和停止容器操作
docker start 容器id [[启动容器]]
docker restart 容器id [[重启容器]]
docker stop 容器id [[停止容器]]
docker kill 容器id [[干掉]]
常用其他命令
后台启用容器
# 命令 docker run -d 镜像名字
[root@localhost ~]# docker run -d centos
docker ps 发现容器停止
[[常见]] docker 容器使用后台启动 必须要有一个前台进程,ocker发现没有应用,就会停止
查看日志
docker logs -f -t --tail
# -tf 显示日志
# --tail number 显示日志条数
查看容器中的进程信息
# 命令 docker top 容器id
查看镜像的数据源
[root@localhost ~]# docker inspect 5d0da3dc9764
{
"Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"RepoTags": [
"centos:latest"
],
"RepoDigests": [
"centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"
],
"Parent": "",
"Comment": "",
"Created": "2021-09-15T18:20:05.184694267Z",
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 231268856,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/c090bf2ce398566d4dad70018d607244b6646a9c737f059ea6154a9d2950aeff/merged",
"UpperDir": "/var/lib/docker/overlay2/c090bf2ce398566d4dad70018d607244b6646a9c737f059ea6154a9d2950aeff/diff",
"WorkDir": "/var/lib/docker/overlay2/c090bf2ce398566d4dad70018d607244b6646a9c737f059ea6154a9d2950aeff/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
进入当前正在运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c25a6d6f6ff2 centos "/bin/bash" About a minute ago Up About a minute kind_jang
[root@localhost ~]# docker exec -it centos bash
[root@e395d0e6e6f9 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@e395d0e6e6f9 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:28 pts/0 00:00:00 /bin/bash
root 16 1 0 14:28 pts/0 00:00:00 ps -ef
[[方式2]] docker attach 容器id
[[测试]]
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e395d0e6e6f9 centos "/bin/bash" 5 minutes ago Up 5 minutes unruffled_ellis
c25a6d6f6ff2 centos "/bin/bash" 7 minutes ago Up 7 minutes kind_jang
[root@localhost ~]# docker attach c25a6d6f6ff2
[root@c25a6d6f6ff2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[[docker]] exec [[进入容器后开启一个新的终端(可以在里面操作)]]
[[docker]] attach 进入容器正在执行的终端 不会启动新的进程
部署软件
安装nginx
[[搜索镜像]]
[root@localhost ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 19857
[[下载镜像]]
[root@localhost ~]# docker pull nginx
Using default tag: latest
docker.io/library/nginx:latest
[[启动镜像]]
[[-d]] 后台运行
[[--name]] 容器名字
[[-p]] 端口号
[root@localhost ~]# docker run -d --name nginx01 -p 5566:80 nginx
[[查询运行的镜像]]
[root@localhost ~]# docker ps
d6262d770438 nginx "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 0.0.0.0:5566->80/tcp, :::5566->80/tcp nginx01
[[后台打印]]
[root@localhost ~]# curl localhost:5566
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[[停止]]
docker ps
docker stop 容器id
安装Tomcat
# 下载
[root@localhost ~]# docker pull tomcat
[[运行启动]]
[root@localhost ~]# docker run -d -p 8585:8080 --name tomcat01 tomcat
[[进入容器]]
[root@localhost ~]# docker exec -it tomcat01 /bin/bash
[[少命令]] Linux、命令少了 没有webapps
[root@localhost ~]# docker exec -it tomcat01 /bin/bash
[root@523cf2308d33:/usr/local/tomcat ] # cp -r webapps.dist/* webapp
部署 ES+kibana
# es暴露端口很多
# es 十分消耗内存
# es数据一般需要放置到安全目录挂载
# 拉取镜像
[root@localhost ~]#docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.13.4
# 查看内存
docker stats
部署1panel
(图形化工具 )
# 安装
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
[[命令]]
1pctl user-info 查看面板信息
1pctl status 查看启动状态
> 很多时候不符合十点半
# Docker镜
# 命令和git一致
donker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:TAG
### commit测试
~~~shell
# 启动一个默认的tomcat
# 发现这个默认的tomcat webapps里面没有应用 拷贝进去进本文件
# 是同commit命令创建新容器
[root@localhost ~]# docker run -d -p 8080:8080 tomcat
6677ed6ae886ea08a95934434c3cbea0782a00652f0d526e9ecb5fabfc46f3bd
[root@localhost ~]# docker exec -it 6677ed6ae886 /bin/bash
root@6677ed6ae886:/usr/local/tomcat# cp -r webapps.dist/* webapps
[root@localhost ~]# docker commit -a="goudan" -m="webapps app" 6677ed6ae886 tomcat01:1.0
sha256:ab5411dea9c24e5acb6b91ab43819933edc56c6efd43d47ab800ef5cd74c92f5
[root@localhost ~]# docker images
\REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat01 1.0 ab5411dea9c2 14 seconds ago 684MB
数据容器卷
什么是数据容器卷
docker理念回顾
将应用打包成一个镜像
如果数据在容器中,删除及丢失 ==数据==
mysql,容器删了,删库跑路 ==需求:mysql数据可以存地==
使用数据卷
方式1. 直接使用命令来挂载
docker run -it -v (虚拟机吗目录 docker容器目录)
[root@localhost ~]# docker run -it -v /home/cehsi:/home tomcat01:1.0 /bin/bash
[root@localhost home]# docker exec -it f7eecce03709 bash
[[查看是否创建成功]]
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7eecce03709 tomcat01:1.0 "/bin/bash" 6 minutes ago Up 6 minutes 8080/tcp jolly_germain
[root@localhost home]# docker inspect f7eecce03709 (查看挂载信息)
-v挂载
"Mounts": [
{
"Type": "bind",
"Source": "/home/cehsi", 目的地主机内
"Destination": "/home", 容器内的地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
ps:修改只需要在本地修改即可 容器内会自动同步
实战测试:安装mysql
思考:mysql数据持久化的问题
[[获取镜像]]
[root@localhost ~]# docker pull mysql (下载镜像)
[[运行容器]] 需要挂载数据 [[安装启动]] 需要配置密码
-d 后台运行 -p端口映射 -v 数据卷挂载 -e 环境配置 --name 命名 -it 伪终端
[root@localhost ~]# docker run -d -it -p 3310:3306 -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql/datda.d -e MYSQL_ROOT_PASSWORD=990601.Ao --name mysql01 mysql:5.7
[[删除容器]] 挂载的也不会丢失 实现了数据持久化
具名和匿名挂载
# 匿名挂载
-v 容器命令 -P (大写 随机映射端口)
docker run -d -P --name neinx01 -v /etc/nginx nginx
[[查看所有的volume]] 的情况
[root@localhost ~]# docker volume ls
local fa27e35884f38704f09958ed91a8918504b0771a508e635d51a17496f776e615
local portainer_data
[[匿名挂载]] 在-v 只写了容器路径 没有写容器外的路径
[[具名路径]]
[root@localhost ~]# docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx
612f141ea2fdf332dac5bbae8a7a7aec97deec3e3b8bc492dbc29691a6aeccab
[root@localhost ~]# docker volume ls
local juming-nginx
[[通过]] -v 卷名:容器内路径
[[查看这个卷]]
所有的docker容器内的卷 没有指定目录的情况下 都是在 ==/var/lib/docker/volumes/xxxxx/_data==
通过具名挂==载可以方便我们==找到我们的一个卷 大多数情况使用 ==具名挂载==
[[如何确定使用具名挂载还是匿名挂载,还是指定路径挂载]]
-v 容器内路径 [[匿名挂载]]
-v 卷名:容器内路径 [[具名挂载]]
-v /宿主机路径:容器内路径 [[指定路径挂载]]
拓展:
docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx#通过 -v 容器内路径:ro rw 改变读写权限
ro readonly [[只读]]
rw readweite [[可读可写]]
[[设置了这个容器权限]] 容器对挂出来的内容就有限定了
docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx:ro nginx
docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx:rw nginx
[[ro]] 只要看到就说明只能通过宿主机惭怍 容器内部是无效的
初识dockerfile
dockerfile是用来构建Docker镜像的构建文件 命令脚本 体验装
用过脚本可以生成镜像 镜像是一层一层的 简脚本是一个一个的命令 每个命令都是一层
[[创建一个dockerfile文件名字可以随机]] 建议dockerfile
[root@localhost ~]# cd /home
[root@localhost home]# mkd
mkdict mkdir mkdosfs mkdumprd
[root@localhost home]# mkdir docker-test-volume
[root@localhost home]# ls
cehsi docker-test-volume mysql
[root@localhost home]# cd docker-test-volume
[root@localhost docker-test-volume]# pwd
/home/docker-test-volume
[[dockerfile]] 编辑
[[文件中的内容]] 指令大写 参数
FROM centos
VOLUME ["/volume01"]
CMD echo "---end---"
CMD /bin/bash
[[生成]]
[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile -t goudan/centos:1.0 . (最后面点不能少 -f 本地镜像 -t 生成镜像)
[[查看]]
[root@localhost docker-test-volume]# docker images
goudan/centos 1.0 278dc8e1ca8e 2 years ago 231MB
[[启动]]
[root@localhost ~]# docker run -it goudan/centos:1.0 /bin/bash
这个卷和外部一定有同步的目录 (以上是匿名挂载)
[[查看互通]]
[root@8699b3170f83 /]# cd volume01/
[root@8699b3170f83 volume01]# touch container.txt
[root@8699b3170f83 volume01]# ls
container.txt
[[查看匿名挂载]] inspect 容器内容
[root@localhost ~]# docker inspect 8699b3170f83
"Mounts":/var/lib/docker/volumes/fa280abee28d4df9524b3813d69390fea7793412ca2aea5bff5b1d22db2e8495/_data
[root@localhost]# cd /var/lib/docker/volumes/fa280abee28d4df9524b3813d69390fea7793412ca2aea5bff5b1d22db2e8495/_data
[root@localhost _data]# ls
container.txt
数据卷容器
多个centos同步数据
[[启动三个容器]] 通过自己写的镜像启动
docker run -d -it --name centos01 goudan/centos:1.0
docker run -d -it --name centos02 --volumes-from centos01 goudan/centos:1.0
docker run -d -it --name centos03 --volumes-from centos01 goudan/centos:1.0
# --volumes-from 多容器数据共享
多个mysql实现数据共享
[root@localhost ~]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/b/mysql -e MYSQL_ROOT_PASSWORD=990601.Ao --name mysql01 mysql:5.7
[root@localhost ~]# docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=990601.Ao --name mysql02 --volumes-from mysql01 mysql:5.7
[[可以实现两个数据库同步]]
结论:
容器之间配置信息的传递 数据卷容器的生命周期一直持续到没有容器使用为止
但是一旦持久化到了本地 这时候本地的数据是不会删除的
Dockerfile
dockerfile介绍
dockerfile是构建docker镜像的文件 命令参数脚本
构建步骤
1.编写dockesfile文件
2.docker build构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜。Docker Hub,阿里云镜像仓库)
官方很多镜像都是基础包 很多功能都没有 我们通常自己搭建自己的镜像
Dockerfile构建过程
基础知识
- 每个保留关键字(指令)必须是大写字母
- 指令是从上到下顺序执行
- [[表示注释]]
- 每一个直径都会创建提交一个镜像层,并提交
dockerfile是面向开发的 以后需要发布项目 做镜像 就需要编写dockerfile文件 文件十分不简单
docker镜像逐渐成为企业交付标准 必须要掌握
步骤:开发,部署,上线运维
dockerfile:构建文件,定义了一切的步骤,源代码
dockerimages:通过dockerfile构建生成的镜像,就是最终要发布运行的产品
docker容器:容器就是镜像运行提供服务的
dockerfile指令
==FROM== 指定基础镜像(镜像的妈妈是谁)
==MAINTAINER== 指定维护者信息(告诉别人,谁负责养她)
==RUN== 在命令前面加run即可(你想让她干啥)
==ADD== copy文件,会自动解压(给他点创业资金)
==WORKDIR== 设置当前工作目录(我是cd 今天刚化了妆)
==VOLUME== 设置卷,挂载主机目录(给他一个存放行李的地方)
==EXPOSE== 指定对外的端口(他要打开的门是啥)
==RUN== 指定容器要干的事情(奔跑吧)
==CMD== 指定这个容器启动的时候运行的命令,只有最后一个生效(可被替代)
==ENTRYPOINT== 指定这个容器启动的时候运行的命令 可以追加命令
==COPY== 类似ADD 将我们的文件拷贝到镜像中
==ENV== 构建的时候设置环境变量
实战测试
Docker Hub中99%的镜像都是从基础镜像FROM scratch过来的 然后配置需要的软件和配置来进行构建
创建自己的rockylinux
[[编写dockerfile文件]]
[root@localhost dockerfile]# cat mydockerfile-centos
FROM rockylinux
MAINTAINER goudan<4484651@qq.com>
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD "---end---"
CMD /bin/bash
[root@localhost dockerfile]# docker build -f mydockerfile-centos -t mylinux:1.00 .
[[命令]] docker build -f 文件路径 -t 镜像名字:版本号
[[测试运行]]
[root@localhost dockerfile]# docker run -it --name linux01 mylinux:1.00
[root@localhost dockerfile]# docker run -it --name linux02 mylinux:1.00
[root@b75b17a7f1b2 local]# pwd
/user/local [[默认进的根目录]]
[[查看镜像的构造过程]]
[root@localhost dockerfile]# docker history 7721b0d7bf1a
IMAGE CREATED CREATED BY SIZE COMMENT
7721b0d7bf1a 5 hours ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0
<missing> 5 hours ago CMD ["/bin/sh" "-c" "\"---end---\""] 0B buildkit.dockerfile.v0
<missing> 5 hours ago CMD ["/bin/sh" "-c" "echo $MYPATH"] 0B buildkit.dockerfile.v0
<missing> 5 hours ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 5 hours ago RUN /bin/sh -c yum -y install net-tools # bu… 13.3MB buildkit.dockerfile.v0
<missing> 5 hours ago RUN /bin/sh -c yum -y install vim # buildkit 67.9MB buildkit.dockerfile.v0
<missing> 5 hours ago WORKDIR /user/local 0B buildkit.dockerfile.v0
<missing> 5 hours ago ENV MYPATH=/user/local 0B buildkit.dockerfile.v0
<missing> 5 hours ago MAINTAINER goudan<4484651@qq.com> 0B buildkit.dockerfile.v0
<missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:790b4c6a174560d47… 205MB
[[history]] 查看构造目录
CMD和ENTRYPOINT的区别
[[cmd配置]]
[root@localhost dockerfile]# vim dockerfile-cmd
[root@localhost dockerfile]# cat dockerfile-cmd
FROM rockylinux
CMD ["ls","-a"]
[[制作镜像]]
[root@localhost dockerfile]# docker build -f dockerfile-cmd -t cmdtest:1.0 .
[[启动镜像]] 发现ls -a 生效了
[root@localhost dockerfile]# docker run cmdtest:1.0
.
..
.dockerenv
bin
dev
[root@localhost ~]# docker run 4185992a7dfa -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
[[cmd的情况下-l]] 替换了cmd["ls",-a]命令,-l不是命令所以报错
==ENTRYPOINT==
[[编辑entrypoint]]
[root@localhost dockerfile]# vim dockerfile-ENTRYPOINT
[root@localhost dockerfile]# cat dockerfile-ENTRYPOINT
FROM rockylinux
ENTRYPOINT ["ls","-a"]
[[制作镜像]]
docker build -f dockerfile-ENTRYPOINT -t entrypoint:1.0 .
[[执行镜像]]
[root@localhost dockerfile]# docker run entrypoint:1.0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
[[追加命令]] -l (成功) 追加的命令直接拼接在我们的entrtpoint后面
[root@localhost dockerfile]# docker run entrypoint:1.0 -l
total 4
drwxr-xr-x. 1 root root 6 Jun 6 15:10 .
drwxr-xr-x. 1 root root 6 Jun 6 15:10 ..
-rwxr-xr-x. 1 root root 0 Jun 6 15:10 .dockerenv
lrwxrwxrwx. 1 root root 7 Oct 11 2021 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jun 6 15:10 dev
dockerfile中很多命令都十分相似 需要去了解他们的区别 最好就是对比他们的测试效果
doker提交镜像
- 注册自己账号
- 确定这个账号可以登录
- 在服务器上面提交镜像
docker login -u
输入密码
# 提交镜像 docker push
失败
[[增加一个tag]]
docker tag 镜像ID 镜像:TAG
[[提交镜像也是按照镜像层级来提交]]
DOCKER网络
网络模式
docker采用
bridge 桥接docker(默认 自己创建也是用bridge模式)
none : 不配置网络
host : 和宿主机共享网络
container : 容器网络联通 局限性大
测试
# 直接启动命令 --net bridge 这个就是我们的docker0
docker run -d -p --name tomcat01 tomcat
docker run -d -p --name tomcat01 --net bridge tomcat
[[docker0]] 特点: 默认:不能域名访问 --link可以打通 局限性太大
[[可以自定义网络]]
自定义网络
==自定义配置==
# --driver bridge
# --subnet 192.168.0.0/16
# --gateway 192.168.0.1
配置命令
# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[[好处:]] 自己自定义网络 功能比较全 可以域名访问 推荐
redis:不同的集群使用不同的网络,保证集群是安全健康的