收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cf61416ee67 nginx “/docker-entrypoint.…” 7 minutes ago Up 6 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx1
#### 重启容器
使用命令:"docker restart {容器ID|容器名称}"来重启容器
#### 进入容器
使用命令:“docker exec -it {容器ID|容器名称} /bin/sh"来进入容器,后面”/bin/sh"是指定进入容器时用的终端,如果容器内有其他的可以自行修改
[root@docker ~]# docker exec -it nginx1 /bin/sh
exit
[root@docker ~]# docker exec -it nginx1 /bin/bash
root@4cf61416ee67:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4cf61416ee67:/# exit
exit
#### 容器删除
使用命令:"docker rm {容器ID|容器名称}"来删除已经关闭的容器,如果容器在运行中想要强制删除可以加’-f’参数进行强制删除
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cf61416ee67 nginx “/docker-entrypoint.…” 15 minutes ago Up 7 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx1
[root@docker ~]# docker rm -f nginx1
nginx1
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#### 容器日志
使用命令:"docker logs {容器ID|容器名称}"来查看容器运行时的日志
[root@docker ~]# docker run -p 8081:80 -d --name myweb nginx
497eff031c03927f17fe14fcff49bea832403687d580294c42f9cfba697a1564
[root@docker ~]# docker logs myweb
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/05/02 05:30:57 [notice] 1#1: using the “epoll” event method
2022/05/02 05:30:57 [notice] 1#1: nginx/1.21.6
2022/05/02 05:30:57 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2022/05/02 05:30:57 [notice] 1#1: OS: Linux 4.18.0-348.el8.0.2.x86_64
2022/05/02 05:30:57 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/05/02 05:30:57 [notice] 1#1: start worker processes
2022/05/02 05:30:57 [notice] 1#1: start worker process 32
2022/05/02 05:30:57 [notice] 1#1: start worker process 33
#### 容器转镜像
使用命令:"docker commit {容器ID|容器名称} 镜像名称"来打包容器,如果容器在运行中可以使用-p参数
[root@docker ~]# docker commit -p myweb myweb:v1.0
sha256:05f5efa5b56fd3d9c6d17b74ee4a3e9866095ac8cc681879dda21b9b7a968859
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myweb v1.0 05f5efa5b56f 4 seconds ago 142MB
nginx latest fa5269854a5e 11 days ago 142MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
#### 容器信息
使用命令"docker inspect {容器ID|容器名称}"来查看容器的详细信息
他会列出很多很多信息 我这里举例筛选出容器的IP看一下
[root@docker ~]# docker inspect myweb|grep IP
“LinkLocalIPv6Address”: “”,
“LinkLocalIPv6PrefixLen”: 0,
“SecondaryIPAddresses”: null,
“SecondaryIPv6Addresses”: null,
“GlobalIPv6Address”: “”,
“GlobalIPv6PrefixLen”: 0,
“IPAddress”: “172.17.0.2”,
“IPPrefixLen”: 16,
“IPv6Gateway”: “”,
“IPAMConfig”: null,
“IPAddress”: “172.17.0.2”,
“IPPrefixLen”: 16,
“IPv6Gateway”: “”,
“GlobalIPv6Address”: “”,
“GlobalIPv6PrefixLen”: 0,
## DockerFile
### 概述
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
### 构建参数
#### COPY
复制指令,从上下文目录中复制到容器里面
用法:
COPY [–chown=用户:组] 源路径 容器目的路径
–chown可以不使用
#### ADD
ADD和COPY使用格式类似 同样需求下官方是推荐使用COPY
#### RUN
运行命令
用法:
RUN 命令
#### CMD
类似与Run 与RUN不同的是 CMD是在docker run 的时候执行 而RUN是在dockerfile构建镜像的时候执行
用法和RUN一样
#### ENTRYPOINT
类似CMD参数,但其不会被docker run的命令参数覆盖用法和RUN、CMD一样(当dockerfile存在多个此参数的时候只会执行最后一个)
#### ENV
改变环境变量,定义环境变量。
ENV key value
#### ARG
和ENV效果一样但是只会在dockerfile构建的时候生效 构建好容器之后不生效
#### VOLUME
定义默认挂载数据卷 当运行容器的时候如果没有定义位置会自动挂载
VOLUME 路径 路径
#### EXPOSE
声明端口 当使用-P运行容器的时候就是映射的这个端口
EXPOSE 端口
#### WORKDIR
指定工作目录 就是链接的时候的默认目录
WORKIDIR 目录
#### USER
用来指定执行后续命令的用户
USER 用户
### 构建
写好Dockerfile文件之后使用命令"docker build 镜像名称:版本 dockerfile的目录"来构建
[root@docker ~]# mkdir dockerfile
[root@docker ~]# cd dockerfile/
[root@docker dockerfile]# vim dockerfile
[root@docker dockerfile]# cat dockerfile
FROM nginx
RUN echo ‘我是dockerfile构建的容器’ > /usr/share/nginx/html/index.html
[root@docker dockerfile]# docker build -t mynginx:v1.0 ./
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
—> fa5269854a5e
Step 2/2 : RUN echo ‘我是dockerfile构建的容器’ > /usr/share/nginx/html/index.html
—> Running in d73c0f94b402
Removing intermediate container d73c0f94b402
—> 4650cd039883
Successfully built 4650cd039883
Successfully tagged mynginx:v1.0
[root@docker dockerfile]# docker images |grep mynginx
mynginx v1.0 4650cd039883 10 seconds ago 142MB
## Docker的网络
### 概述
Docker网络是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络无法直接访问到容器,从而实现网络的隔离。
### 网络模式
#### Host
![host](https://image.boychai.xyz/article/Docker_network_host.png)
启动容器时使用host模式,那这个容器将不会获得一个独立的ip,而是和宿主机共用一个ip,容器将不会虚拟出自己的网卡,而是使用宿主机的ip和端口,但是容器其他方面,比如文件系统,进程系统都是独立。
#### Container
![container](https://image.boychai.xyz/article/Docker_network_container.png)
启动容器时使用Container使用的时候需要指定一个容器id或者容器名称,这个模式会和指定的容器共享同一个ip,和host一样除了ip是共享对应容器的ip之外,容器的其他方面,比如文件系统,进程系统都是独立的。
#### None
![none](https://image.boychai.xyz/article/Docker_network_none.png)
启动容器时使用None,Docker容器将不会生成网卡,也就是说容器会没有网卡,ip,路由等信息。需要我们自己来添加。这种网络情况只会又一个lo回环网卡。
#### bridge
![bridge](https://image.boychai.xyz/article/Docker_network_bridge.png)
当docker服务启动的时候,会在主机上创建一个docker0的虚拟网卡,此主机默认启动的容器都会链接到这个虚拟网卡上。类似与vmwar 的一个虚拟网络。
### 网络管理
#### 网络列表
使用命令:"docker network ls"来列出所有当前网络
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ac3a791d7c38 bridge bridge local
cb275e88b131 host host local
68b3fda03c16 none null local
#### 创建网络
docker network create 参数 网络名称
-d:网路模式
–subnet:指定网段
–gateway:指定网关(指定虚拟网卡得ip)
自定网络可以支持很多东西 比如不需要dns可以通过容器名来互相ping同
比如我用network create了一个网络 并且创建了两个容器 os1,os2 使用os1pingos2的时候会互通 不需要配置任何的dns 他会自动寻找 默认的docker0则就没有这个功能
[root@docker ~]# docker network create -d bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynetwork
5fb087dccbabedf4b97fcc09b448ee717acbfa35fc520698985f536dea8be5e7
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ac3a791d7c38 bridge bridge local
cb275e88b131 host host local
5fb087dccbab mynetwork bridge local
68b3fda03c16 none null local
#### 删除网络
使用命令:“docker rm {网络ID|网络名称}”
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ac3a791d7c38 bridge bridge local
cb275e88b131 host host local
5fb087dccbab mynetwork bridge local
68b3fda03c16 none null local
[root@docker ~]# docker network rm mynetwork
mynetwork
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ac3a791d7c38 bridge bridge local
cb275e88b131 host host local
68b3fda03c16 none null local
#### 关联容器
docker network connect 命令是用于将docker容器 连接/断开 到某个网络中,或者与其他容器 建联/断开,容器可以使用容器名或者容器ID。
用法:
docker network connect/disconnect {网络ID|网络名称} {容器ID|容器名称}
#### 详细信息
使用命令:"docker network inspect {网络ID|网络名称}"来查询网络的详细信息
[root@docker ~]# docker network create -d bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynetwork
af5233ce4e299130cadee1bc8c9754b576bfb63d6ac229ad7856a653b2109e1e
[root@docker ~]# docker network inspect mynetwork
[
{
“Name”: “mynetwork”,
“Id”: “af5233ce4e299130cadee1bc8c9754b576bfb63d6ac229ad7856a653b2109e1e”,
“Created”: “2022-05-02T02:44:46.644429172-04:00”,
“Scope”: “local”,
“Driver”: “bridge”,
“EnableIPv6”: false,
“IPAM”: {
“Driver”: “default”,
“Options”: {},
“Config”: [
{
“Subnet”: “192.168.1.0/24”,
“Gateway”: “192.168.1.254”
}
]
},
“Internal”: false,
“Attachable”: false,
“Ingress”: false,
“ConfigFrom”: {
“Network”: “”
},
“ConfigOnly”: false,
“Containers”: {},
“Options”: {},
“Labels”: {}
}
]
## Docker-Compose容器编排
### 概述
Docker Compose可以轻松,高效的管理容器,他是一个用于定义和运行多个容器的docker的应用程序工具。在生产环境中一个应用肯定有很多个docker容器构成,而就单纯的docker一次性只能实现单个容器的部署,为了这个问题,docker compose 应运而生。
### 安装
**官方下载文档**:https://docs.docker.com/compose/install/
docker默认不自带docker-compose工具,需要自己手动去下载
[root@docker ~]# curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 664 100 664 0 0 1412 0 --:–:-- --:–:-- --:–:-- 1412
100 25.2M 100 25.2M 0 0 239k 0 0:01:48 0:01:48 --:–:-- 365k
[root@docker ~]# chmod +x /usr/bin/docker-compose
[root@docker ~]# docker-compose -v
Docker Compose version v2.4.1
### 使用和管理
#### 使用
使用docker-compose需要在目录里定义一个名称为"docker-compose.yml"的yml文件,这个文件就是用来定义服务配置的之后可以使用docker-compose来管理这个文件里定义的资源。
官方文档:[Docker-Compose](https://bbs.csdn.net/topics/618679757)
#### 启动
docker-compose up
在当前目录定义好docker-compose的yml文件之后可以使用此命令来运行,默认在前台运行可以追加"-d"参数使其运行在和后台。
#### 重新运行
docker-compose restart
重启全部定义的容器资源
#### 停止运行
docker-compose stop
停止运行定义的容器
#### 删除
docker-compose down
停止并删除对应的容器
### YML配置参考
#### docker-compose.yml的格式
#全局配置层
version: 3 #版本
services:
##定义层
app1:
##配置层
image: nginx:1.26 #镜像
ports:80:80 #端口映射
environment: aa=bb #系统环境
volumes: #挂载卷定义
networks: #网络定义
app2:
app3:
…
#### version
这个版本需要和docker的版本相对应具体对应信息可去官网查看[版本对照](https://bbs.csdn.net/topics/618679757)
#### build
在配置层定义,如果自己定义了dockerfile想让docker-compose来运行可以直接使用build来构建。
version: “3”
services:
myapp:
build: .
#### image
在配置层定义,用来指定镜像
version: “3”
services:
myapp:
image: nginx
#### command
在配置层定义,修改容器启动时执行的命令
version: “3”
services:
myapp:
image: centos
command: [“bash”]
#### container\_name
在配置层定义,默认docker-compose启动容器的名称格式为<项目名称>*<服务名称>*<序号>,这个参数可以直接修改容器的名字
version: “3”
services:
myapp:
container_name: myapp
image: centos
command: [“bash”]
#### environment
在配置层定义,定义容器的环境变量
version: “3”
services:
myapp:
container_name: mySQL
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: aaaaaa
#### env\_file
在配置层定义,和environment一样用来定义环境变量,他这个是指定一个文件,直接使用environment来定义环境变量可能会有一些敏感信息不适合直接放在docker-compose里使用,env\_file可以指定一个环境文件,文件格式为键值对的方式key=value
version: “3”
services:
myapp:
container_name: mySQL
image: mariadb
env_file:
- ./env
[root@boychai docker-compose]# cat env
MYSQL_ROOT_PASSWORD=aaaaaaa
#### depends\_on
在配置层定义,用来配置启动关系,配置了之后里面写其他服务容器的名称,只有里面定义容器启动后,自己才会启动,可以理解为服务容器启动的前提条件。
version: “3”
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: mysql
#### restart
在配置层定义,用来配置重启策略,模式如下
\*\*no:\*\*是默认的重启策略,在任何情况下都不会重启容器
\*\*always:\*\*容器总是重新启动
\*\*on-failure:\*\*在容器非正常退出时(退出状态非0),才会重启容器
\*\*unless-stopped:\*\*在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
version: “3”
services:
web:
restart: always
build: .
depends_on:
- db
- redis
redis:
restart: always
image: redis
db:
restart: always
image: mysql
#### volumes
在配置层定义,用来把主机的数据卷或着文件挂载到容器里。如下
version: “3”
services:
myapp:
image: nginx:latest
volumes:
- “/usr/nginx/html:/usr/share/nginx/html”
- “/var/log/nginx:/var/log/nginx”
也可以在全局层进行一个生命,然后配置层进行调用,如下
version: “3”
services:
myapp:
image: nginx:latest
volumes:
- nginx_html:/usr/share/nginx/html
- nginx_log:/var/log/nginx
volumes:
- nginx_html: /usr/nginx/html
- nginx_log:/var/log/nginx
#### networks
网络配置,默认不声明的话docker会自动生成一个默认的bridge类型的网络,在全局配置层定义一个networks,如下配置
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/1df61d979977fc25264f82854996d9ca.png)
![img](https://img-blog.csdnimg.cn/img_convert/c14bac011cd820b7bb751b516830cae6.png)
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
/html"
- "/var/log/nginx:/var/log/nginx"
也可以在全局层进行一个生命,然后配置层进行调用,如下
version: "3"
services:
myapp:
image: nginx:latest
volumes:
- nginx_html:/usr/share/nginx/html
- nginx_log:/var/log/nginx
volumes:
- nginx_html: /usr/nginx/html
- nginx_log:/var/log/nginx
networks
网络配置,默认不声明的话docker会自动生成一个默认的bridge类型的网络,在全局配置层定义一个networks,如下配置
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
[外链图片转存中…(img-R4pKXJu8-1715639400941)]
[外链图片转存中…(img-HK5K8Tys-1715639400942)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!