安装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 - CommunityVersion:           20.10.17API version:       1.41Go version:        go1.17.11Git commit:        100c701Built:             Mon Jun  6 23:02:46 2022OS/Arch:           linux/amd64Context:           defaultExperimental:      true
// 这里没出现什么报错就是正常了 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Server: Docker Engine - CommunityEngine:Version:          20.10.17API version:      1.41 (minimum version 1.12)Go version:       go1.17.11Git commit:       a89b842Built:            Mon Jun  6 23:00:51 2022OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.6.6GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1runc:Version:          1.1.2GitCommit:        v1.1.2-0-ga916309docker-init:Version:          0.19.0GitCommit:        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 mode1            /usr/sbin/iptables-legacy   10        manual mode2            /usr/sbin/iptables-nft      20        manual modePress <enter> 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 <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

FROM nginxENTRYPOINT ["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.listRUN 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 s@archive.ubuntu.com@mirrors.aliyun.com@g /etc/apt/sources.list
RUN sed -i s@security.ubuntu.com@mirrors.aliyun.com@g /etc/apt/sources.listRUN 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:                                    # 服务名字:mediabuildercontainer_name: mediabuilder                   # 容器名字 指定自定义容器名称mediaserver,而不是生成的默认名称。build:                                         # 构建方式 指定为构建镜像上下文路径context: ./dockerfile: Dockerfile.build                   # 在 ./ 目录下执行 Dockerfile.run指定的镜像networks:                                      # 配置容器连接的网络,引用顶级 networks 下的条目 media_net:ipv4_address: 192.168.1.10volumes:                                       # 挂载对应映射- ./code:/opt/media/codecommand: [ "sh", "/opt/media/code/build.sh" ]  # 启动时执行networks:                                      # 顶级networksmedia_net:ipam:driver: defaultconfig:- subnet: 192.168.0.0/16
# https://docs.docker.com/compose/compose-file/#ipam 网络相关设置

run.yaml

version: '3'
services:                               # 要启动什么服务mediaserver:                            # 服务名字 mediaservercontainer_name: mediaserver           # 容器名字 指定自定义容器名称mediaserver,而不是生成的默认名称。build:                                # 构建方式 指定为构建镜像上下文路径context: ./                            # 在 ./ 目录下执行 Dockerfile.run指定的镜像dockerfile: Dockerfile.runrestart: 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/Dockerfile/docker compose相关推荐

  1. docker内程序如何读取dockerfile和compose.yml中设置的环境变量

    docker内程序如何读取dockerfile和compose.yml中设置的环境变量 背景 compose文件中配置了服务A和服务B,其中B服务调用了A服务的接口,那么B的实现代码中该如何调用A的服 ...

  2. .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行

    本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...

  3. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  4. 工作记录二-Docker+Dockerfile

    1. 安装虚拟机 Oracle VM VirtualBox, 安装centos 7.2版本 2. 需要在命令行中先设置代理: export http_proxy=proxy.xxxxx.com:808 ...

  5. Docker三剑客之Compose

    Docker三剑客之Compose Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用. Compose 基本介绍 Compose ...

  6. docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限

    为了能使容器内的SpringBoot项目的日志方便查看,我想用容器卷挂载的方式,将容器内生成的日志文件挂载到服务器上,实现同步,即使生成了新的镜像,依赖于compose file的配置,也能使日志在服 ...

  7. Docker容器之compose容器集群的快速编排

    Docker容器之compose容器集群的快速编排 前言 一.Docker-compose简介 二.YAML文件格式及编写注意事项 (1)YAML文件格式 (2)YAML格式的注意事项 (3)YAML ...

  8. Docker 及 Docker Compose 安装及使用教程 (2020版)

    文章目录 图文详细教程 1 Docker原理 2 Docker安装 3 镜像(Image) 3.1 获取镜像 3.2 查找拖取镜像 3.3 列出镜像 3.4 删除镜像 3.5 创建的镜像 4 容器(C ...

  9. Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建

    文章目录 Docker 简介 为什么使用docker: Docker引擎: Docker系统镜像: Docker容器: Docker仓库: ubuntu安装docker: ubuntu脚本自动安装: ...

最新文章

  1. 计算机专业英语文章翻译,计算机专业英语英汉双语文章翻译
  2. 高效背诵面试题、回答问题的技巧,求职者必看!
  3. “\”C++中的换行符
  4. 谈谈软件工程设计的艺术
  5. Docker-服务安装
  6. CHM文件出现的常见错误及解决办法
  7. thinkphp htmls.php,ThinkPHP静态缓存简单配置和使用方法详解
  8. NVM node版本管理工具的安装和使用
  9. 苹果mac三维动画设计渲染软件:Cinema 4D R20 (c4d r20)
  10. Unity UGUI —— 鼠标穿透UI问题(Unity官方的解决方法)
  11. LeetCode - Remove Duplicates from Sorted List
  12. WinRAR去广告方法,了解一下?
  13. 云信api_服务端API文档
  14. 看工业4.0道路上,美国和德国的不同路径
  15. 只能修饰唯一一个html元素的选择器是,HTML常用标签和CSS选择器的使用及演示——2019.1.14...
  16. 我来告诉你,草根程序员如何进入BAT
  17. promise跟ajax区别,Promise和AJAX有什么区别?
  18. android 圆角 水波纹_Android实现水波纹点击效果
  19. 织梦网站数据入库接口(实现图片本地化,自动图片打水印)【原创】
  20. Quantopian 做空恐慌指数回测

热门文章

  1. python经典程序练习题6:健康食谱的输出。列出5种不同的食材,输出两两之间可能的组合形式
  2. 大公司的高薪 OR 创业公司的期权,更加看中大公司的高薪?
  3. python变量名必须以字母或下划线开头不区分字母大小写_Python变量名必须以字符或下划线开头,并且区分字母大小写。...
  4. Kaggle: Tweet Sentiment Extraction 方法总结 Part 1/2: 常用方法总结
  5. E-NCAP增加黑暗场景下AEB测试,红外夜视或成主流配置
  6. 汇编语言||基本传送指令MOV的用法详解
  7. java设计模式--装饰器模式
  8. 正态分布(normal distribution)与偏态分布(skewed distribution)
  9. DOS死机客星,能打破程序死循环,按住Ctrl +Esc即可使死掉的程序立即返回到Dos Shell
  10. 冒泡排序从左到右 从右到左方法实现(三种方法)