【开发】一篇文章精通Docker | 狂神Docker学习笔记 | Docker容器基础命令 | Docker-主机挂载 | 创建、发布Docker镜像 | 配置Dockerfile文件

【Docker】容器挂载文件修改后 Commit 新镜像,挂载文件不会更新 在使用某个镜像的时候,由于需要频繁修改镜像中的某些文件,于是就将这些文件所在的文件夹挂载到宿主机上了,在需要更新的时候,直接更新宿主机上挂载的目录下的文件来达到更新容器中的文件。那么这时候 Commit 容器成新的镜像,会包含挂载路径下面更新的文件吗? 阅读详情

docker 的常用命令

帮助命令

docker version			 # 显示docker的版本信息
docker info				 # docker详细信息
docker 命令 --help		# 万能命令	

镜像命令

docker images 查看所有本地主机上的镜像

[root@mushan /]	# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   5 months ago   13.3kB

#	解释
REPOSITORY	镜像仓库源
TAG			镜像的标签
IMAGE ID	镜像的ID
CREATED		镜像创建的时间
SIZE		镜像的大小

#	可选项(可混合使用)
-a, --all	 列出所有镜像
-q, --quiet	 只显示镜像的id

docker search 搜索镜像

➜  mushan docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11308     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4294      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   838                  [OK]

#	解释
NAME			镜像仓库源的名称
DESCRIPTION		镜像描述
START			点赞量
OFFICIAL		是否 docker 官方发布
AUTOMATED		自动构建

#	可选项, 通过搜索来过滤
--filter=STARS=3000		# 搜索镜像STARS大于3000

docker pull 下载镜像

# 下载镜像 docker pull 镜像名[:tag](版本默认为最新)
[root@mushan /]# docker pull mysql     
Using default tag: latest		# 如果不写tag, 默认为latest(最后一个, 最新版)
latest: Pulling from library/mysql
e1acddbe380c: Pull complete 	# 分层下载, docker image的核心 联合文件系统
bed879327370: Pull complete 
03285f80bafd: Pull complete 
ccc17412a00a: Pull complete 
1f556ecc09d1: Pull complete 
adc5528e468d: Pull complete 
1afc286d5d53: Pull complete 
6c724a59adff: Pull complete 
0f2345f8b0a3: Pull complete 
c8461a25b23b: Pull complete 
3adb49279bed: Pull complete 
77f22cd6c363: Pull complete 
Digest: sha256:d45561a65aba6edac77be36e0a53f0c1fba67b951cb728348522b671ad63f926	# 签名(防伪)
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest	# 真实地址
# 等价于
docker pull mysql
docker pull docker.io/library/mysql:latest

# 下载特定版本
[root@mushan /]# docker pull mysql:5.7
5.7: Pulling from library/mysql		# tag == 5.7
e1acddbe380c: Already exists 		# 前面已经安装了mysql最新版, 5.7版本有重复内容, 共用无需下载
bed879327370: Already exists 
03285f80bafd: Already exists 
ccc17412a00a: Already exists 
1f556ecc09d1: Already exists 
adc5528e468d: Already exists 
1afc286d5d53: Already exists 
4d2d9261e3ad: Pull complete 
ac609d7b31f8: Pull complete 
53ee1339bc3a: Pull complete 
b0c0a831a707: Pull complete 
Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7e
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

#查看本地镜像
➜  / docker images        
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         5.7       6c20ffa54f86   4 days ago     448MB
mysql         latest    5a4e492065c7   4 days ago     514MB
hello-world   latest    d1165f221234   5 months ago   13.3kB

# 此时同时存在 mysql:latset 和 mysql:5.7 两个版本

docker rmi 删除镜像

# 通过ID删除
docker rmi -f ID					#删除指定容器
docker rmi -f ID ID ID				#删除多个指定容器
docker rmi -f $(docker images -aq)	#删除全部容器
➜  mushan docker rmi -f 6c20ffa54f86
Untagged: mysql:5.7
Untagged: mysql@sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7e
Deleted: sha256:6c20ffa54f8674203e91e3225e489aa505fa04b8d482954a8b6d7414842c6de4
Deleted: sha256:7ecf077dd9d6725f0e594b9cd5eb214ad1b3764fa75bf5940ab08b05b8bae184
Deleted: sha256:c28edab85681de37f9d2a75dde941a20d2e1ac6e4efb7dee391913d3ec722fef
Deleted: sha256:6c11b187da1ecb65ce10b25f54354f3515ce9d26fabcd859cdb43dbd625df907
Deleted: sha256:d0dfc5be0883ed4af9f642a8e4f2312a93c4241ec8e89f22219b0f0a0d26c8d3
# 只删除与 mysql:latest 不共用的内容

# 删除本地全部docker镜像
➜ mushan docker rmi -f $(docker images -aq)
$: 表示把括号里面的内容作为参数传入
docker images -aq: 表示查出本地所有的镜像ID

➜  mushan docker images                  # 此时镜像列表为空   
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
# 通过命名删除 
docker rmi -f 镜像名[:tag]								# 删除指定容器单个版本
docker rmi -f $(docker images mysql -aq)			  # 删除指定容器全部版本
docker rmi -f 镜像名[:tag] 镜像名[:tag]				  # 删除多个指定容器单个版本
...
同等嵌套类似

inspect 查看镜像数据源

docker inspect 容器ID

容器命令

说明: 有了镜像之后才可以创建容器, linux, 下载一个centos镜像测试学习

docker pull centos

新建容器并启动

docker run[可选参数] image

# 参数说明
--name="Name"		容器名字 name1 name2, 用来区分容器
-d					以后台方式运行
-it					使用交互方式运行, 进入容器查看内容
-i					允许你对容器内的标准输入 (STDIN) 进行交互。
-t					在新容器内指定一个伪终端或终端。
-p(小写)			   指定容器的端口 -p 8080:8080
-P(大写)			   随机指定端口
#-p(小写) 格式: 
-p 主机端口:容器端口	#(常用)
-p 容器端口
容器端口
!测试
# 启动并进入容器
➜  / docker run -it centos /bin/bash
[root@9e8f5d24331a /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# 从容器中退回主机
exit
➜  / ls
bin  boot  dev  etc  home  lib  lib64  lost+found  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

列出运行的容器

docker ps			列出当前正在运行的容器完整信息
docker ps -a		列出历史运行过的容器完整信息
docker ps -n=?		列出?个历史运行过的容器完整信息
docker ps -q		列出当前正在运行的容器编号

#[可选项]可以混合使用
# 测试
➜  / docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9b8c37b20ae6   centos    "/bin/bash"   35 minutes ago   Up 22 minutes             vigilant_thompson

# 输出详情介绍
CONTAINER ID:			 容器 ID。
IMAGE:					 使用的镜像。
COMMAND:				 启动容器时运行的命令。
CREATED:				 容器的创建时间。
STATUS:					 容器状态。
PORTS:					 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES:					 自动分配的容器名称。

# 7种状态
created					(已创建)
restarting				(重启中)
running / Up			(运行中)
removing				(迁移中)
paused					(暂停)
exited					(停止)
dead					(死亡)

退出容器

exit				# 直接容器停止并退出
ctrl + p + q		# 退出, 但不停止容器

启动和停止容器操作

docker start 容器id				# 启动容器
docker restart 容器id				# 重启容器
docker stop 容器id				# 停止当前正在运行的容器
docker kill 容器id				# 强制停止当前正在运行容器

导出和导入容器快照

导出容器快照: docker export 容器id > 文件名
docker export 1e560fca3906 > centos.tar

导出容器快照: cat docker /文件名 | docker import - test/镜像名:[:tag]
cat docker/centos.tar | docker import - test/ubuntu:v1
#此外,也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

docker rm 容器ID					# 删除指定容器
docker rm -f $(docker ps -aq)	 # 删除全部容器(-f 表强制 可删除正在运行容器)
docker ps -a -q|xargs docker rm  # 删除全部容器

常用其他命令

后台启动容器:

# 通过-d 方式创建容器 		docker run -d 镜像名
docker run -d centos

# 问题docker ps. 发现 centos 停止了

# 常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程, 如果没有前台进程, 只在后台运行, docker发现没有应用, 就会自动停止nginx, 容器启动后, 发现自己没有提供服务, 就会立刻停止(自杀), 就是没有程序了
一般采用 -itd 来后台启动

查看日志

docker logs -f -t --since="时间戳" --tail=查看个数 容器id
# 例: 	docker logs -f -t --since="2019-04-15T02:14:00" --tail=1000  9c03ea2c
# 参数解释
-f:				动态实时显示
-t:				显示日志生成时的时间戳
--since:		从指定时间戳开始(默认中时区,即在北京东八区的时间戳上减去8小时)
--tail / -n:	显示最后的条数

# 测试:
# 自己编写一端shell脚本
docker run -d centos /bin/bash -c "while true; do echo mushan;sleep 1;done"

查看容器中进程信息

# top命令
➜  / docker top 5ba11c251c85
UID            PID            PPID          C       STIME      TTY      TIME     
root           23430          23399         0       16:27      ?        00:00:00 
root           27032          23430         0       16:52      ?        00:00:00 

# 解释
UID		用户ID
PID		进程ID
PPID	父进程ID

查看镜像源数据

# inspect命令
docker inspect 容器ID
[
    {
        "Id": "5ba11c251c8508d2519c67e708fce5a8e2ccbbd753cc89245554bae37f5b82d7",
        "Created": "2021-08-22T16:27:38.5583555Z",
        "Path": "/bin/bash",
        "Args": [
            "-c",
            "while true; do echo mushan;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            ... ... ... ... ... .
        }
        ... ... ... ... ... ...
]

进入当前正在运行的容器

# 容器通常使用后台方式运行, 有时需要进入容器, 修改一些配置

# 方式一:	(进入容器后开启一个新的终端, 可以在里面操作)
#docker exec -it 容器id bashShell
➜  / docker exec -it 5ba11c251c85 /bin/bash

# 方式二:
#docker attach 容器id		(进入容器正在执行的终端, 不会启动新的进程!)
➜  / docker attach 5ba11c251c85
正在执行当前的代码...

从容器内拷贝文件到主机

docker cp 容器id:容器内路径 目的主机路径
容器id 使用 docker ps -a查看(即是容器关闭了, 只要容器还在, 就可以获取内容)
转到主机
# 测试:
docker cp 872613da391c:/home/mushan.cpp /home
➜  /home ls
docker_ceshi.txt  mushan  mushan.cpp(这个就是拷贝过来的内容)

可视化

  • portainer
  • Rancher ( CI/CD 再用)

portainer

什么是 portainer ?

Docker图形化界面管理工具 ! 提供一个后台面板操作 !

安装运行:

➜  / docker run -d -p 8088:9000 \--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer 
Unable to find image 'portainer/portainer:latest' locally
Blatest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete 
49d59ee0881a: Pull complete 
a2300fd28637: Pull complete 
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
7502fee2a1282c2302530f18b07ec2f52540eb3407cd2d21a07b0702111250f9

访问测试 : 外网 : 8088

浏览器查看: http://192.168.138.129:8088/

在这里插入图片描述

访问成功!

Username: admin
Password: 12345678

进入本地仓库

在这里插入图片描述

Docker容器镜像原理讲解

跳过… baidu

Commit镜像

格式

docker commit 提交容器成为一个新的副本

# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

实战测试

# 启动一个默认的tomcat
# 官方的镜像中, webapps 中默认是没有文件的
# webapps.dist 中 拷贝内容给 webapps.
# 此时我在容器里面在官方tomcat的基础上发了改变
# 我认为我修改后的容器更加方便, 想把它打包成容器.
➜  ~ docker ps                                    
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                       NAMES
b09303c24d37   tomcat    "catalina.sh run"   14 minutes ago   Up 14 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   funny_einstein
➜  ~ docker commit -a="mushan" -m="add webapps app cp webapps.dist" b09303c24d37 tomcat_mushan:1
.0
sha256:c24575315327b17d7abd6d8f9904f4721e10098f9b6efda0903855531d0961d1
➜  ~ docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat_mushan         1.0       c24575315327   8 seconds ago   673MB
tomcat                latest    266d1269bb29   6 days ago      668MB
nginx                 latest    dd34e67e3371   8 days ago      133MB
portainer/portainer   latest    580c0e4e98b0   5 months ago    79.1MB
centos                latest    300e315adb2f   8 months ago    209MB
kibana                7.6.2     f70986bc5191   17 months ago   1.01GB
elasticsearch         7.6.2     f29a1ee41030   17 months ago   791MB
➜  ~ 
# 这里出现了我们打包提交成功的 tomcat_mushan

对比 tomcat 和 tomcat_mushan

# tomcat_mushan (共11层)

... ... ... ...省略
 "RootFS":
 "sha256:c2ddc1bc2645ab5d982c60434d8bbc6aecee1bd4e8eee0df7fd08c96df2d58bb",
 "sha256:62d14713f2e98841ec3927e3ab611b13e414a21fb82fc0e604a9008ac53e45dc",
 "sha256:1235daf38153d083ae5b4f605acc54f9401143b5fbd033801ba373a8cfb04845",
 "sha256:7d890913ab6955350bdd25d04c60dd444db13890c401cbcdc8e00e9bd29c90fc",
 "sha256:c2e2307780ac2fa0d39cec874c4545156da890c1bcc42b3259114ac29bb598f1",
 "sha256:75f6a0e6e441cd3d74125443fc73eb26bf9ceb557b269b25bddaa2ef459227f7",
 "sha256:b19f17003e5ae07f7aba99f95736627aaa1ff3c92832f7d6920158dc6b138bcf",
 "sha256:2dad09b8a57e12408adc0366cbd2a642eaab1c82bbfb2b442245928b60d337f1",
 "sha256:83a14c3e974e700768197a3061f840618a924d3154fcb338a85b6da5fd4eb886",
 "sha256:19f8bd134bcf7c5870f8294b1d3bba4c970d0b622772865e44d200d248ed2676",
 "sha256:997ad98329327bc8cc90838a8804a5ad4c93d5286e03decf2715bbb035e4a5a1"
        ... ... ... ...省略
        
# tomcat (共10层)

... ... ... ...省略
 "RootFS":
 "sha256:c2ddc1bc2645ab5d982c60434d8bbc6aecee1bd4e8eee0df7fd08c96df2d58bb",
 "sha256:62d14713f2e98841ec3927e3ab611b13e414a21fb82fc0e604a9008ac53e45dc",
 "sha256:1235daf38153d083ae5b4f605acc54f9401143b5fbd033801ba373a8cfb04845",
 "sha256:7d890913ab6955350bdd25d04c60dd444db13890c401cbcdc8e00e9bd29c90fc",
 "sha256:c2e2307780ac2fa0d39cec874c4545156da890c1bcc42b3259114ac29bb598f1",
 "sha256:75f6a0e6e441cd3d74125443fc73eb26bf9ceb557b269b25bddaa2ef459227f7",
 "sha256:b19f17003e5ae07f7aba99f95736627aaa1ff3c92832f7d6920158dc6b138bcf",
 "sha256:2dad09b8a57e12408adc0366cbd2a642eaab1c82bbfb2b442245928b60d337f1",
 "sha256:83a14c3e974e700768197a3061f840618a924d3154fcb338a85b6da5fd4eb886",
 "sha256:19f8bd134bcf7c5870f8294b1d3bba4c970d0b622772865e44d200d248ed2676"
        ... ... ... ...省略
        
# 可以发现 tomcat 和 tomcat_mushan 仅仅在tomcat的基础上多加了最后一层

启动 tomcat_mushan 试试效果:

➜  ~ docker run -it -p 8081:8081 tomcat_mushan:1.0

tomcat_mushan:

在这里插入图片描述

tomcat:

在这里插入图片描述

容器数据卷

什么是容器数据卷

docker的理念回顾

例: 将一个MySQL容器打包成一个镜像 !
当删除这个这个容器的时候, 里面存储的数据文件就会丢失 ! (删库跑路)
此时这种情况会很危险
需求: 数据持久化
需求: MySQL数据可以存储在本地 !
为了实现这一需求, 容器之间可以由一个数据共享技术 (卷技术) ! Docker 容器中产生的数据, 同步到本地

如何使用卷 : -v 挂载

docker run -it -v 主系统的一个路径:容器中的一个路径

# centos容器为例
docker run -it -v /home/ceshi:/home centos /bin/bash
# 此时 主文件系统和容器文件系统 挂载的路径将会互通
无论容器是否处于运行状态, 无论是哪一路径下内容发生改变, 另一方都会同时发生相同的变化
容器和主系统两端一直是一致互通的

具名和匿名挂载

-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx					(匿名)
# 匿名挂载: 只写容器内路径, 不写容器外路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx	(具名)
# 具名挂载: 通过 -v 卷名:容器内路径

volume 卷命令

docker volume --help

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

➜  / docker volume ls  
DRIVER    VOLUME NAME
local     4b13ad4d9594573dc7d7b2cc944ae56b838c3b437aa3735377fb0f25c25cb526
local     d205865d4dcd5d50c97c09f532d580350f65180f2d1b3f48b425a71ea9ed0135
local     juming-nginx
# 前两个分别是mysql 和 nginx 的匿名挂载, 第三个是 nginx 的具名挂载
➜  / docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-08-27T07:27:06Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
➜  / docker volume inspect d205865d4dcd5d50c97c09f532d580350f65180f2d1b3f48b425a71ea9ed0135
[
    {
        "CreatedAt": "2021-08-27T06:49:28Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/d205865d4dcd5d50c97c09f532d580350f65180f2d1b3f48b425a71ea9ed0135/_data",
        "Name": "d205865d4dcd5d50c97c09f532d580350f65180f2d1b3f48b425a71ea9ed0135",
        "Options": null,
        "Scope": "local"
    }
]

所有没设定挂载路径的卷, 默认都在路径 /var/lib/docker/volumes/挂载名/_data_ 路径下

挂载名, 如果是具名挂载就是以-v后的子串命名, 否则为匿名挂载以生成的一段规律字串命名

通过 -v 容器内路径: ro / rw 改变读写权限

# 通过 -v 容器内路径: ro / rw 改变读写权限(默认是rw)
ro:		readonly		#只读
rw:		readwrite		#读写
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# 一旦设置了容器权限, 容器对挂载出来的内容就有了限定
# 设定为 ro 时, 这个路径将只能通过宿主机来操作, 容器内部是无法操作的

初始Dockerfile

Dockerfile: 用来构建 docker 镜像的构建文件 ! 命令脚本 !

通过这个脚本可以生成镜像, 镜像是一层一层的, 脚本一个个的命令, 每个命令都是一层

创建路径		 mkdir /home/docker-test-volume 
创建编辑文件		vim dockerfile1
# 自定义Dockerfile
FORM centos							# 以centos为基础
VOLUME ["volume01", "volume02"]		# 挂载目录(这里是匿名挂载)
CMD echo "----end----"				# 完成后输出"----end----"
CMD /bin/bash						# 默认进入使用 bash 控制台
➜  / docker build -f /home/docker-test-volume/dockerfile1 -t mushan/centos:1.0 
.
# 参数说明
build	命令构建镜像
-f		通过什么脚本文件构建(脚本路径)
-t		生成: 镜像名:[tag]
.		当前目录


# 返回内容:
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01", "volume02"]
 ---> Running in add71936df4a
Removing intermediate container add71936df4a
 ---> f005f45db9de
Step 3/4 : CMD echo "----end----"
 ---> Running in 01b8f543c1bc
Removing intermediate container 01b8f543c1bc
 ---> 0ef638078484
Step 4/4 : CMD /bin/bash
 ---> Running in 89be86ba72c5
Removing intermediate container 89be86ba72c5
 ---> 37a96d02edb1
Successfully built 37a96d02edb1
Successfully tagged mushan/centos:1.0

# 成功生成镜像
➜  docker-test-volume docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mushan/centos         1.0       37a96d02edb1   6 minutes ago   209MB

数据卷容器

通过--volumes-from命令, 实现两个容器之间的挂载与数据同步 (伪同步)

测试:

创建三个centos镜像

docker run -it --name="centos01" mushan/centos:1.0 /bin/bash
docker run -it --name="centos02" --volumes-from centos01 centos:latest /bin/bash
docker run -it --name="centos03" --volumes-from centos01 centos:latest /bin/bash

# 规则1: 必须有一个容器与宿主机某路径同步挂载
# 规则2: 仅仅同步与宿主机挂载的路径
--volumes-from 命令只不过是把centos01 与宿主机挂载的内容cp了进去
# 三个容器同时同步宿主机挂载路径

同步成功后...
# 进入宿主机挂载路径, 发现内容是同步的
➜  _data pwd     
/var/lib/docker/volumes/4883e91e3f0583ba8e03081644542386ef685b28bd34bcb9c1e86fb3566dec7c/_data
➜  _data ls
mushan

# 把路径删除/4883e91e3f0583ba8e03081644542386ef685b28bd34bcb9c1e86fb3566dec7c
rm -rf 4883e91e3f0583ba8e03081644542386ef685b28bd34bcb9c1e86fb3566dec7c

# 此时无论在哪个容器中创建文件/文件夹都会失败
[root@6dd479046fcf volume01]# mkdir mushan
mkdir: cannot create directory 'mushan': No such file or directory

# 此时就算把文件夹创建回来也没有用

DockerFile

Dockerfile: 用来构建 docker 镜像的构建文件 ! 命令脚本 !

构建步骤

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像( Docker Hub , 阿里云镜像仓库)
# centos-8官方dockerfile
FROM scratch
ADD centos-8-x86_64.tar.xz /
LABEL \
	org.label-schema.schema-version="1.0"\
    org.label-schema.name="CentOS Base Image"\
    org.label-schema.vendor="CentOS"\
    org.label-schema.license="GPLv2"\
    org.label-schema.build-date="20201204"
CMD ["/bin/bash"]

DockerFile 的创建

FROM				# 指定基础镜像, 一切从这里开始构建
MAINTAINER			# 指定维护者信息(姓名 + 邮箱)
RUN					# 运行一些内容, 可以echo输出一些东西
COPY				# 将文件拷贝到镜像中
ADD					# COPY文件, 会自动解压
WORKDIR				# 设置默认工作目录
VOLUME				# 设置卷, 挂载主机目录
EXPOSE				# 暴露端口
CMD					# 指定容器启动时要运行的命令(只有最后一个会生效, 会被覆盖)
ENTRYPOINT			# 指定容器启动时要运行的命令, 可追加命令
ONBUILD				# 被继承时触发指令
ENV					# 创建时设置环境变量

CMD: 命令可以用于默认设置, 比如启动方式/bin/bash为默认, 但是如果用户想通过其他的方式启动, 默认失效

发布镜像

DockerHub

  1. 登录DockerHub

    docker login 用户名
    password: 输入密码
    
  2. tag命令修改镜像名(添加一个标签)

    docker tag 本地镜像名[:tag] 要修改的镜像名[:tag]
    # 一般使用 mushan/镜像名 命名
    
  3. 上传镜像

    docker push 修改后的镜像名[:tag]
    

Docker网络

docker0

ip addr		# 查看ip

在这里插入图片描述

[Docker学习笔记]利用Dockerfile创建镜像 本文旨在指导读者如何通过 Dockerfile 创建和优化 Docker 镜像,从而简化软件部署流程。我们将从 Dockerfile 的基础知识讲起,逐步深入到编写 Dockerfile 的最佳实践,包括如何选择基础镜像、设置工作环境、复制文件、安装依赖、暴露端口以及定义容器启动命令 阅读详情

相关推荐

使用DockerFile构建docker镜像挂载目录,数据卷同步

docker镜像是一层一层的,在用dockerFile编写脚本时,也要遵循层级关系。 使用dockerFile构建一个简单的docker镜像 使用docker 命令执行该文件‘ docker build -f dockerFile -t dftomcat:1.0 . 3.验证第二步 是否挂载成功 docker run -d -P --name tomcat006 dftomcat:1.0 挂载成功!使用dockerFile挂载镜像就可以省去在docker run -v时的挂载。 ...

qq_43750656的博客 1万+

Docker(八)Container无法正常启动Restarting (1) Less than a second ago的原因及解决办法

一、Docker启动异常表现: 背景:images:keywords_exact:v1和启动container的命令如下: $ cat docker_run.sh docker run --network host \ --name keywords_exact \ --restart=always \ -d keywords_exact \ bash run.sh $ cat run.sh #!/bin/bash gunicorn -c gunicorn.py run

凝眸伏笔的博客 4万+

Docker(四):容器数据卷与Dockerfile构建镜像(发布)

🟢 Docker(四):容器数据卷与Dockerfile构建镜像(发布)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 4万+

Docker教程(一)——Docker入门概述

文章目录一、是什么1、为什么会有Docker?2、Docker的理念二、能干嘛1、虚拟机技术2、容器虚拟化技术3、开发自运维(DevOps)三、Dockor三要素1、镜像(image)2、容器(container )3、仓库(repository)4、小结 一、是什么 1、为什么会有Docker? 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验

云中、漫步的博客 768

精通docker 原书高清PDF及随书章节代码

docker 是Linux下面的容器技术,是目前较火的开源技术之一,在大数据,云计算的时代中,我们的docker也渐渐的将在虚拟化技术上面进一步发展

docker入门到精通

docker从入门到精通,从0到1的讲解到docker的应用,docker各个指令的用法,docker-compose,Kubernetes等。适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。物有所值,值得你拥有来学习,做参考手册。

portainer的安装

1 docker pull portainer/portainer:latest 2、 docker volume create portainer_data 3、 docker run -d -p 9000:9000 -p 8000:8000 --privileged=true --name portainer --restart always -v /var/run/docker.so...

zmm0420的专栏 1427

【第4章 光模块实测方法总结(环境搭建、眼图测试、接收测试、注意事项)】

本文系统介绍了光模块测试的完整流程与关键要点,涵盖低速模块到3.2T PAM4超高速模块的测试方法。内容包括:1)测试环境搭建(光路/电路要求);2)核心测试项目(眼图分析、接收灵敏度/饱和测试、误码压力测试);3)PAM4专项测试(TDECQ、RLM线性度等);4)可靠性测试(温循、电压、老化);5)八大注意事项(如禁止脏端面测试、长短距混插等)。特别强调高速模块对测试环境的高敏感性,需重点关注波形质量而非单纯光功率,并需进行严格压力测试才能暴露潜在问题。

学无止境 456

(十三) Docker轻量级可视化工具Portainer

docker可视化工具Portainer的使用

小怪的博客 808

使用单片机和电流互感器对非正弦周期电流有效值测定

使用单片机和电流互感器,利用一种高速采样的方法来进行有效值测定

月光绿叶滴水音乐 3946

FFmpeg视频缩放终极指南:从基础命令到保持宽高比的5种实战技巧

本文是FFmpeg视频缩放的终极指南,详细讲解了从基础命令到保持宽高比的5种实战技巧。针对不同平台(如抖音、B站、Instagram)的分辨率要求,提供了具体的参数模板和批量处理脚本,帮助内容创作者高效、精准地调整视频大小,避免画面变形或黑边问题,实现多平台适配。

juice的博客 462

Docker从入门到精通

Docker从入门到精通

m0_59347746的博客 3346

DIY必备:如何用N-MOS管搭建低成本DC有刷电机驱动电路(附原理图+避坑指南)

本文详细介绍了如何使用N-MOS管搭建低成本、高可靠性的DC有刷电机驱动电路。针对DIY爱好者,从核心原理、电路设计、元件选型到焊接调试,提供了完整的实战指南,并重点解析了续流二极管选型、栅极驱动设计等关键避坑要点,帮助读者成功驱动电机并确保电路稳定运行。

delta的博客 776

B站狂神Docker学习笔记

内容主要基于B站狂神老师的Docker基础视频与部分网络docker博客总结,按照个人理解所整理总结。PDF需要的自取:https://yxmiaoyu.lanzouu.com/b01dm3ehg 密码:1234

异侠 2万+

HWSD全球土壤数据下载处理

下载地址: http://www.fao.org/soils-portal/soil-survey/soil-maps-and-databases/harmonized-world-soil-database-v12/en/

江北20190411的博客 3万+

AFSim 2.9实战指南:从入门到精通的中文教程

本文是AFSim 2.9的实战中文教程,旨在帮助用户从零开始掌握这一先进的仿真框架。内容涵盖从环境安装、运行第一个“Hello World”仿真,到深入理解实体、组件、想定编辑器等核心概念,并进阶探讨动力学建模、传感器仿真与红蓝对抗想定构建。最后,指南还提供了效能分析与实战排错技巧,帮助用户将仿真结果转化为有价值的量化数据,适用于军事、航空航天等领域的复杂系统行为模拟研究。

weixin_29294395的博客 361

Docker(下)(Docker镜像、容器数据卷、编写DockerFile)

写博客即是为了记录自己的学习历程,也希望能够结交志同道合的朋友一起学习。文章在撰写过程中难免有疏漏和错误,欢迎指出文章的不足之处;更多内容请点进爱敲代码的小游子查看。 临渊羡鱼,不如退而结网。一起加油! 一、Docker镜像 镜像是什么? 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件 (1)UnionFS(联合文件系统) UnionFS(联合文件系统):Union文件系统是一种分层、轻量级..

小游子YKY的博客 8428

ROS入门(一)——ROS安装(vmware16+ubuntu20.04+ROS-Noetic)

嵌套:ROS可以在Ubuntu上运行,Ubuntu在虚拟机Vmware中安装。 从 虚拟机vmware安装→ubuntu安装→ros安装,逐步介绍安装ROS环境的过程。整个过程是我一步步跟着各种博客安装实现的,亲测可行。 版本: Vmware :Vmware Workstation16 Ubuntu :20.04 ROS :Noetic 其中vmware直接载当前最新版本就好,而ubuntu的版本要注意一下。 在ROS官网(cn - ROS Wiki),我们进入到ROS安装的步骤界面,可以看..

Netceor的博客 9741

docker 进阶 之容器数据卷 DockerFile Docker网络 --- 狂神说

笔记整理自 B站UP 狂神说Java https://www.bilibili.com/video/BV1og4y1q7M4 容器数据卷 什么是容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化 MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地! 容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地! 这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

cheng的博客 1万+

掌握C++新特性中智能指针的综合指南

本文是一篇关于C++中智能指针的综合指南,旨在深入探讨现代内存管理的核心概念和技术。智能指针是C++中一种强大的工具,可以帮助开发人员更安全、高效地管理内存资源。通过详细解析各种类型的智能指针,包括unique_ptr、shared_ptr和weak_ptr,读者将了解它们的原理、用法和适用场景。本文将重点介绍智能指针的优势,如自动内存释放、避免内存泄漏和循环引用等问题。此外,还将讨论智能指针与传统指针的区别,并提供一些最佳实践和实用技巧,帮助读者在实际项目中正确、高效地使用智能指针。

Lion_Long的博客 1200

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Docker】Docker挂载和修改容器中的目录及配置文件的若干种方式

nginx.conf文件的内容,不管你是去网上搜也好,起了一个nginx容器进去复制也好[1],都要找到一个完整正确的对应文件的内容,写入宿主机中你想要挂载目录下的对应文件中,文件名要和Docker中的一致。需要我们去把vim装上。需要说明的是,以后两种方式进行挂载的,是不能自己指定目录位置的,一般是docker会在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(这个指定目录不同版本的docker会有所不同),我当前的目录为:/var/lib/docker/volumes/{容器ID}[3]。

不想睡觉的橘子君的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

狂神 Docker学习笔记 从基础到进阶 一步到位

Docker 学习笔记 感谢狂神的分享。附上B站视频链接。 https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=9225650362300658796&spm_id_from=333.337.0.0 目录 目录Docker 学习笔记目录Docker概述(1) 基本介绍(2) 应用场景(3) Docker 的优势(4)虚拟化技术和容器化技术Docker安装Docker的基本组成安装阿里云镜像加速Docker 运行流程图底层原

原名陌生的博客 5800

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

狂神docker学习笔记

Docker 基本使用、学习笔记

Htupc的博客 7173

Docker镜像创建的三种方式(基于已有镜像、本地模板、Dockerfile)

文章目录一、Docker镜像概念二、Docker镜像的创建2.1 Docker镜像的创建方法2.2 基于已有镜像创建2.3 基于本地模板创建2.4 基于Dockerfile创建2.4.1 实战:构建SSH镜像2.4.2 构建systemctl镜像2.4.3 构建Nginx镜像2.4.4 构建Tomcat镜像2.4.5 构建MySQL镜像(MySQL 5.7) 一、Docker镜像概念 Docker 镜像是 Docker 容器运⾏时的只读模板,每⼀个镜像由⼀系列的层 (layers) 组成。Docker 使⽤

u014042047的博客 5万+

【SpringBoot框架篇】6.docker部署,并挂载配置文件到宿主机上面

docker部署springboot项目,并挂载配置文件到宿主机上面准备一个springboot项目项目里配置文件内容编写一个web方位,用于测试重定向配置文件准备好构建镜像需要的文件编写Dockerfile文件构建镜像并运行把需要构建的文件上传到服务器修改配置文件内容启动镜像测试配置文件属性是否变化挂载配置文件到宿主机停止并删除刚刚构建的容器修改配置文件构建容器并指定配置外部文件测试配置后的效果...

皓亮君的博客 1万+

Docker容器挂载

docker的理念:将应用和环境打包成一个镜像!通过镜像启动容器运行 问题:在容器中存储的程序数据是需要持久化的,不能容器删了数据也随之删除。比如,安装一个MySQL容器,在其中存储了大量数据,结果把容器删了数据也没了,就相当于删库跑路,这是不可能发生的 数据卷技术的引入:我们希望Docker容器产生的数据可以自动同步到本地,这样容器删了数据并不会丢失;同时数据也可在容器之间共享。这就是卷技术,也就是目录的挂载,将容器内的目录挂载到linux上 总结:容器的持久化和同步操作!容器间也可以实现数据共享! 使

chenxuezhou的博客 1万+
下一篇: 【算法模板】Kruskal算法 | 克鲁斯卡尔 | 最小生成树
MuShan-bit
博客等级 码龄5年 538粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MuShan-bit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值