https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/
在x86环境下,由容器统一管理开发及运行环境。
Docker
https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/
#官方docker源(被墙),不推荐
#sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#清华docker源,推荐
sudo add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce --allow-unauthenticated
sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker
sudo dockerd 手动启动docker
sudo service docker start 后台启动docker
zyx@DESKTOP-3QJ3KNF:~$ docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:02:46 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
// 这里没出现什么报错就是正常了 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:00:51 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0
sudo service docker status
sudo docker run hello-world
sudo dockerd 显示启动docker,看日志中的docker /var/log/docker.log
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
docker没启动成功,看日志,有可能是wsl2没更新成功,先看这个问题
可能需要重启一下内核
iptables/1.8.2 Failed to initialize nft: Protocol not supported
failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain: (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
https://blog.csdn.net/0210/article/details/124349371
sudo update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/sbin/iptables-nft 20 auto mode
1 /usr/sbin/iptables-legacy 10 manual mode
2 /usr/sbin/iptables-nft 20 manual mode
Press to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode
docker images
// 查看下载到计算机的镜像
//当镜像执行时,它会生成一个容器,我们在容器中添加所需的软件后,可以把这个容器再次打包成新镜像。并可以把这个镜像上传到 Docker hub 上// 在容器中更改文件只会修改容器中的,不会修改镜像
docker run -it ubuntu:15.10 /bin/bash
docker run -d ubuntu:15.10 /bin/sh -c “while true; do echo hello world; sleep 1; done”
faecb4f2ec1b07065c35a187897145dbf7e833ce0be4d881fd12dff970257197
docker stop cid
docker ps -a
docker stop cid
docker restart cid
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
docker export 1e560fca3906 > dk_test.tar
docker import dk_test.tar dk_test:v1 //对导入的镜像文件指定REPO:TAG
docker pull training/webapp
docker network create -d bridge test-net
docker network ls
运行一个容器并连接到新建的 test-net 网络:
docker run -itd --name test1 --network test-net ubuntu /bin/bash
FROM:定制的镜像都是基于 FROM 的镜像
RUN
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
COPY 从上下文目录中复制文件或者目录到容器里指定路径。
ADD
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
CMD
CMD ["<可执行文件或命令>","","",...]
CMD ["","",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
# $ docker run nginx:test //docker run nginx:test -c /etc/nginx/new.conf
ENV
ARG
EXPOSE
仅仅是声明端口
Dockerfile 基本操作 https://www.runoob.com/docker/docker-dockerfile.html
docker compose 基本操作 https://www.runoob.com/docker/docker-compose.html
流媒体服务器
1 docker中启动zlmeidiakit服务器
cd /home/zyx/deploy/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hM58aQaH-1674922385308)(.assets/16748926838361.png)]
确保ZLMediaKit的docker服务有正常运行;
涉及指令:docker-compose -f docker-compose-run.yml start (启动)
docker-compose -f docker-compose-run.yml stop (停止)
docker-compose -f docker-compose-run.yml restart (重启)
工作中需要把zlMediaKit的服务器在docker中部署,同时最好编译docker时,流媒体服务器仍能提供服务。分成两部分来执行。
Dockerfile.build
FROM ubuntu:20.04 AS build
WORKDIR /opt/media/
# ADD sources.list /etc/apt/sources.list
RUN sed -i s@http://.*archive.ubuntu.com@http://mirrors.aliyun.com@g /etc/apt/sources.list
RUN sed -i s@http://.*security.ubuntu.com@http://mirrors.aliyun.com@g /etc/apt/sources.list
RUN apt-get update && \
DEBIAN_FRONTEND="noninteractive" \
apt-get install -y --no-install-recommends \
build-essential \
cmake \
git \
curl \
vim \
wget \
ca-certificates \
tzdata \
libssl-dev \
libmysqlclient-dev \
libx264-dev \
libfaac-dev \
gcc \
g++ \
libavcodec-dev libavutil-dev libswscale-dev libresample-dev \
gdb && \
apt-get autoremove -y && \
apt-get clean -y && \
wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz -O libsrtp-2.2.0.tar.gz && tar xfv libsrtp-2.2.0.tar.gz && \
cd libsrtp-2.2.0 && ./configure --enable-openssl && make -j $(nproc) && make install && \
rm -rf /var/lib/apt/lists/*
# 删除本地的软件包列表:rm -rf /var/lib/apt/lists/* 为了不占用资源
# https://blog.csdn.net/asasd101/article/details/110252584 减小Docker镜像大小的方法
Dockerfile.run
FROM ubuntu:20.04
WORKDIR /opt/media/bin/
USER 0:0
ENV PATH $PATH:/opt/media/bin
#暴露哪些端口
EXPOSE 1935/tcp
EXPOSE 554/tcp
EXPOSE 332/tcp
EXPOSE 80/tcp
EXPOSE 443/tcp
EXPOSE 10000/udp
EXPOSE 10000/tcp
EXPOSE 8000/udp
EXPOSE 9000/udp
EXPOSE 50000-60000/udp
EXPOSE 50000/udp
EXPOSE 50002/udp
# ADD sources.list /etc/apt/sources.list
#RUN sed -i s@http://.*archive.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g /etc/apt/sources.list
#RUN sed -i s@http://.*security.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g /etc/apt/sources.list
RUN sed -i [email protected]@mirrors.aliyun.com@g /etc/apt/sources.list
RUN sed -i [email protected]@mirrors.aliyun.com@g /etc/apt/sources.list
RUN apt-get update && \
DEBIAN_FRONTEND="noninteractive" \
apt-get install -y --no-install-recommends \
vim \
wget \
ca-certificates \
tzdata \
curl \
libssl-dev \
libx264-dev \
libfaac-dev \
ffmpeg \
gcc \
g++ \
libavcodec-dev libavutil-dev libswscale-dev libresample-dev \
gdb && \
apt-get autoremove -y && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*
# 默认容器使用UTC时间,跟本地时间相差8个小时,在查看日志的时候时间偏差
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
# FROM- 镜像从那里来
# MAINTAINER- 镜像维护者信息
# RUN- 构建镜像执行的命令,每一次RUN都会构建一层
# CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
# VOLUME- 定义数据卷,如果没有定义则使用默认
# USER- 指定后续执行的用户组和用户
# WORKDIR- 切换当前执行的工作目录
# HEALTHCHECH- 健康检测指令
# ARG- 变量属性值,但不在容器内部起作用
# EXPOSE- 暴露端口
# ENV- 变量属性值,容器内部也会起作用
# ADD- 添加文件,如果是压缩文件也解压
# COPY- 添加文件,以复制的形式
# ENTRYPOINT- 容器进入时执行的命令
build.yaml
version: '3'
services: # 要启动什么服务
mediabuilder: # 服务名字:mediabuilder
container_name: mediabuilder # 容器名字 指定自定义容器名称mediaserver,而不是生成的默认名称。
build: # 构建方式 指定为构建镜像上下文路径
context: ./
dockerfile: Dockerfile.build # 在 ./ 目录下执行 Dockerfile.run指定的镜像
networks: # 配置容器连接的网络,引用顶级 networks 下的条目
media_net:
ipv4_address: 192.168.1.10
volumes: # 挂载对应映射
- ./code:/opt/media/code
command: [ "sh", "/opt/media/code/build.sh" ] # 启动时执行
networks: # 顶级networks
media_net:
ipam:
driver: default
config:
- subnet: 192.168.0.0/16
# https://docs.docker.com/compose/compose-file/#ipam 网络相关设置
run.yaml
version: '3'
services: # 要启动什么服务
mediaserver: # 服务名字 mediaserver
container_name: mediaserver # 容器名字 指定自定义容器名称mediaserver,而不是生成的默认名称。
build: # 构建方式 指定为构建镜像上下文路径
context: ./ # 在 ./ 目录下执行 Dockerfile.run指定的镜像
dockerfile: Dockerfile.run
restart: always # 容器的重启策略 no/always/on-failure/unless-stopped(在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器)
ports: # 宿主机端口:容器的端口
- "8554:554"
- "8443:443"
- "4332:332"
- "1935:1935"
- "8088:80"
- "10000:10000"
- "50000:50000"
- "50002:50002"
- "50000-60000:50000-60000"
volumes: # 挂载到容器
- ./bin:/opt/media/bin # 将主机的数据卷或文件挂载到容器里。
command: [ "sh", "/opt/media/bin/start.sh" ] # 容器启动时的指令
build.sh
#!/bin/bash
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) # 无论在哪里执行该脚本,都能到正确的路径
# 在容器映射路径下的编译指令
cd /opt/media/code/ZLMediaKit && \
rm -fr build release && \
mkdir -p build release/linux/Release/ && \
cd build && \
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_WEBRTC=false -DENABLE_FFMPEG=true -DENABLE_TESTS=false -DENABLE_API=true .. && \
make -j $(nproc)
start.sh
#!/bin/bash
# 在哪里都能进入脚本所在的路径
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)
chmod 755 MediaServer
# 执行对应的可执行文件
./MediaServer -s ssl.pem -c config.ini >> start.log 2>&1
#while true; do sleep 10; done
deploy.sh
通过该脚本,将编译和运行耦合起来
#!/bin/sh
# 把编译好的放入可执行路径下
cp -fr code/ZLMediaKit/release/linux/Release/MediaServer bin/
cp -fr code/ZLMediaKit/release/linux/Release/default.pem bin/
cp -fr code/ZLMediaKit/release/linux/Release/config.ini bin/conf/
cp -fr code/ZLMediaKit/release/linux/Release/www/* bin/www/