docker/Dockerfile/docker compose

安装docker

https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/

在x86环境下,由容器统一管理开发及运行环境。

Docker

https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/

安装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

检查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

错误0 The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 3B4FE6ACC0B21F32

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32

错误1 cannot connect to the docker daemon at unix ///var/run/docker.sock. Is the docker daemon running?

docker没启动成功,看日志,有可能是wsl2没更新成功,先看这个问题

错误2 iptables/1.8.2 Failed to initialize nft: Protocol not supported

可能需要重启一下内核

iptables/1.8.2 Failed to initialize nft: Protocol not supported

错误3 iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1

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基本命令

查看镜像

docker images

// 查看下载到计算机的镜像
//当镜像执行时,它会生成一个容器,我们在容器中添加所需的软件后,可以把这个容器再次打包成新镜像。并可以把这个镜像上传到 Docker hub 上

// 在容器中更改文件只会修改容器中的,不会修改镜像

运行交互式的容器

docker run -it ubuntu:15.10 /bin/bash

  • -t 在新容器内指定一个伪终端或终端
  • -i 允许你对容器内的标准输入 (STDIN) 进行交互

启动容器(后台模式)

docker run -d ubuntu:15.10 /bin/sh -c “while true; do echo hello world; sleep 1; done”

faecb4f2ec1b07065c35a187897145dbf7e833ce0be4d881fd12dff970257197

  • -d 后台启动docker

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

运行一个web应用

docker pull training/webapp

Docker 容器互联

docker network create -d bridge test-net
docker network ls

运行一个容器并连接到新建的 test-net 网络:

docker run -itd --name test1 --network test-net ubuntu /bin/bash

Dockerfile

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 时运行。
  • RUN 是在 docker build

为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。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

Dockerfile 基本操作 https://www.runoob.com/docker/docker-dockerfile.html

docker compose

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

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- 容器进入时执行的命令

compose yaml

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" ] # 容器启动时的指令

shell

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/

你可能感兴趣的:(云原生,工作杂记,docker,git,linux)