1.前言
? 初见DOCKER,感觉和我们常用的虚拟机(VMware,viurebox)类似,是一个独立于宿主机的模块,可以解决程序在各个系统间的移植,但它真的仅仅是这样嘛? 操作系统:
Deepin 20.4
内核版本:
Linux msos 5.10.83-amd64-desktop #20.00.50.06-release SMP Fri Dec 31 09:32:12 CST 2021 x86_64 GNU/Linux
DOCKER版本:
Client: Docker Engine - Community
Version: 20.10.12
API version: 1.41
Go version: go1.16.12
Git commit: e91ed57
Built: Mon Dec 13 11:45:37 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.12
API version: 1.41 (minimum version 1.12)
Go version: go1.16.12
Git commit: 459d0df
Built: Mon Dec 13 11:43:46 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
2.容器的优缺点
1.1.容器优点
- 敏捷性:相对于虚拟机没有“虚拟操作系统”、“Hypervtaor层”,占用资源更低,启动时间也更快。同时可以控制容器资源的分配;
- 隔离性:与实体宿主环境无关,不会和其他服务产生库冲突,通过其高隔离的特性可以快速进行移植和部署;
- 安全性:容器之间相互隔离,互相之间互不影响,即使一台容器受到攻击,也不会影响其他容器的运行;
- 部署方便:搭建好开发环境后,可保存为镜像。需要使用时,直接使用镜像即可;
- 部署安全:保证了开发和生产环境的一致,避免出现“我的环境是好的”的问题;
2.2.容器缺点
- 网络数据和持久化磁盘数据由于是通过连接或映射实现的,因此对效率有一定的影响;
3.DOCKER部署安装
3.1.UBUNTU上安装DOCKER
sudo wget -qO- https://get.docker.com/ | sh
3.2.查看docker版本
docker version
3.3.开启和禁止开机服务自启动
sudo systemctl enable docker
sudo systemctl disable docker
3.4.启动和禁止服务
sudo systemctl start docker
sudo systemctl stop docker
4.DOCKER使用
4.1.镜像
4.1.1.镜像名称
格式:
[Namespace]/[Repository]:[Tag]
说明:
Namespace 镜像的命名空间,用于区别构建镜像的组织或个人
Repository 镜像的档案名称,通常采用服务名称
Tag 用来区别镜像服务版本
例子:
“msavskit/test:01.01.01.01”和“msavskit:01.01.01.38”
4.1.1.镜像搜索
从DockerHub中搜索基本的镜像,用来创建容器。格式:docker search [OPTIONS] TERM
格式:
docker search [OPTIONS] TERM
OPTIONS说明:
-f filter Filter output based on conditions provided
--format string 根据条件进行过滤输出
--limit int 搜索结果的最大数量(默认为25个,最大100)
--no-trunc 不要截断输出
例子:
sudo docker search ubuntu
搜索结果
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 33
ubuntu/mysql MySQL open source fast, stable, multi-thread… 24
ubuntu/apache2 Apache, a secure & extensible open-source HT… 23
ubuntu/prometheus Prometheus is a systems and service monitori… 23
kasmweb/ubuntu-bionic-desktop Ubuntu productivity desktop for Kasm Workspa… 17
说明:
NAME 名称
DESCRJPTION 创建者提供的对镜像的简单描述。
STARS 镜像在宫方镜像仓库中收到用户给出的星星的数量,表示镜像受欢迎的程度
OFFICIAL 镜像是否由 Docker 官方提供
AUTOMATED 镜像是否使用了自动构建
4.1.2. 镜像拉取
格式:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS说明:
-a, --all-tags 下载档案中所有TAG的镜像
--disable-content-trust 跳过镜像验证(默认为true)
--platform string 若服务支持多平台,则设置目标平台
-q, --quiet 关闭冗余输出
例子:
sudo docker pull ubuntu:20.04
4.1.3.镜像查看
格式:
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
-a, --all 显示所有镜像(默认为隐藏中间镜像)
--digests 显示数字
-f, --filter filter 根据条件过滤输出
--format string 使用使用一个Go模板来更好的列出镜像
--no-trunc 不要截断输出
-q, --quiet 只显示镜像ID
例子:
sudo docker image ls
4.1.4.镜像删除
格式:
docker image rm [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
-f, --force 强制移除镜像
--no-prune 不要删除未带标记的父项
例子:
sudo docker image rm [镜像ID或名称]
4.1.5.镜像创建
? Dockerfile是一个可自动创建Docker镜像的配置文件。那么我们首先需要创建一个Dockerfile文件,内容参考如下:
#格式:FROM image,FROM image:tag,FROM image@digest
#说明:FROM必须是第一个非注释指令。一个Dockerfile中可能有多个FROM,用来创建复合镜像,但需要在每个新的FROM命令之前,记录提交输出的最后一个镜像ID。
#例子:基于ubuntu:20.04构建镜像
FROM ubuntu:20.04
#设置镜像的作者信息,可用于提供镜像的帮助,内容可以包括作者名称,邮件或帮助链接
MAINTAINER msavskit<msavskit@163.com>
#格式:LABEL <key>=<value> [<key>=<value> ...]或LABEL <key>[ <value>]
#说明:可以使用docker inspect命令来查看镜像的标签信息
#功能:为镜像提供元数据
#LABEL com.example.vendor="ACME Incorporated"
#格式:ARG [=]
#说明:构建镜像时,可在使用“--build-arg <varname>=<value>”传入参数,也可以定义时,赋予初始值。
#注意:不建议使用构建镜像时,命令传递密码数据,因为其他用户可以通过“docker history”查看到。Docker存在一些预定义ARG,如:HTTP_PROXY http_proxy HTTPS_PROXY https_proxy FTP_PROXY ftp_proxy NO_PROXY no_proxy
#ARG DIR_HOME
#格式:ENV <key> <value>
#说明:作用于构建的镜像和后续的容器(ENV定义的变量会覆盖ARG定义的变量),也可以在运行容器时使用“--env <key>=<value>”进行覆盖
ENV DIR_HOME="/msavskit/"
#格式:WORKDIR /path/to/workdir
#说明:可以多次使用,如果使用相对路径,则相对上次的路径
#功能:设置工作目录
WORKDIR ${DIR_HOME}
#格式:COPY <src> <dest>或COPY ["<src>",... "<dest>"]
#说明:如果源文件是压缩文件(tar,gzip,bzip2等),不会在目的文件目录解压。新目录的权限为0755,UID和GID均为0
#构建镜像时,增加文件到容器的目录
#COPY msavskit/start.sh ${DIR_HOME}
#格式:ADD <src> <dest>或ADD ["<src>",... "<dest>"]
#说明:如果源文件是压缩文件(tar,gzip,bzip2等),将在目的文件目录进行解压。新目录的权限为0755,UID和GID均为0
#构建镜像时,增加文件到容器的目录
ADD msavskit/start.sh ${DIR_HOME}
ADD msavskit/mscore_release.pkg ${DIR_HOME}
#格式:RUN <command> 或 RUN ["executable", "param1", "param2"]
#说明:构建镜像时,执行的指令
RUN bash ${DIR_HOME}/mscore_release.pkg
#格式:EXPOSE <port> [<port>...]
#功能:通知DOCKER,容器运行时监听的端口
EXPOSE 8090
#格式:VOLUME ["/data"]
#功能:创建和挂载数据卷,数据存储在主机的/var/lib/docker/volumes/msavskit_etc/_data目录
#VOLUME /etc/mscore/
#格式:USER [user | user:group | uid | uid:gid | user:gid | uid:group ]
#说明:默认用户为root。Dockerfile中可以多次设置,且只影响后续指令
#功能:设置用于运行后续命令的用户名或UID
#USER root
#格式:ENTRYPOINT param1 param2 或 ENTRYPOINT ["executable", "param1", "param2"]
#说明:ENTRYPOINT中的参数无法被覆盖重写,但CMD的可以。可以在运行容器时,使用-d进行参数传递,当然也可以通过CMD指令进行传递
#功能:指明程序入口点
#ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]
#格式:CMD <command> 、CMD ["executable", "param1", "param2"]和CMD ["param1", "param2"]
#说明:CMD ["param1", "param2"]是为ENTRYPOINT提供默认参数。在Dockerfile文件中只有最后一个CMD生效;
#功能:为正在运行的容器提供默认值
CMD ${DIR_HOME}/start.sh
#格式:STOPSIGNAL <signal>
#功能:停止容器时,Docker传递的停止信号,默认值SIGTERM。可以在docker-create和docker-run时,使用--stop-signal选项来重置该值
#STOPSIGNAL SIGKILL
#格式:ONBUILD [INSTRUCTION]
#功能:当镜像作为构建其他进行的基础镜像时触发
创建start.sh文件,用于启动主进程:
#! /bin/bash
CURPATH=`pwd`
cd ${PATH_SERVER_BIN} && chmod +x ${FILE_SERVER_START}&& ./${FILE_SERVER_START} &
/usr/local/mssrs/etc/init.d/srs start
/usr/local/nginx/sbin/nginx &
/usr/local/mscore/bin/mscore
/bin/bash
构建镜像指令:
格式:
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
--add-host list 添加主机到IP映射
--build-arg list 设置镜像构建时的ARG变量
--cache-from strings 指定作为缓冲源的镜像
--cgroup-parent string 指定容器的(可选)父组
--compress 使用gzip压缩构建内容
--cpu-period int 限制镜像CPU CFS周期
--cpu-quota int 限制镜像CPU CFS配额
-c, --cpu-shares int CPU共享(相对权重)
--cpuset-cpus string 允许执行的CPU(0-3, 0,1)
--cpuset-mems string 允许执行的mem(0-3, 0,1)
--disable-content-trust 忽略镜像验证(默认为true)
-f, --file string Dockerfile文件名称 (默认'PATH/Dockerfile')
--force-rm 移除中间容器
--iidfile string 写入镜像ID的文件
--isolation string 容器隔离技术
--label list 设置镜像的标签变量
-m, --memory bytes 内存限制
--memory-swap bytes 交换内存限制=内存+交换: '-1'表示关闭交换限制
--network string 设定在镜像构建时,RUN指令的网络模式 (默认 "default")
--no-cache 在构建映像时,请不要使用高速缓存
--pull 尝试拉取一个最新版本的镜像
-q, --quiet 抑制镜像构建过程的信息输出,并在构建成功时显示镜像ID
--rm 构建成功后,删除中间容器 (默认true)
--security-opt strings 安全选项
--shm-size bytes 共享内存/dev/shm分区大小
-t, --tag list 指定名称和标记格式,如'name:tag'
--target string 设置构建阶段的目标
--ulimit ulimit 限制选项 (默认 [])
例子:
sudo docker build -f Dockerfile -t msavskit:01.01.01.38 .
4.1.6.镜像迁移
? 镜像导出(可以导出多个镜像)
sudo docker save -o msavskit.tar ubuntu:20.04 msavskit:01.01.01.38
? 镜像导入
sudo docker load -i msavskit.tar
4.1.7.Docker Hub登录
sudo docker login -u <username> -p <password> <server>
server 默认采用 Docker Daemon 中的默认值。
4.1.8.docker image指令
格式:
docker image COMMAND
Commands选项:
build 基于Dockerfile文件构建镜像
history 显示镜像的构建历史信息
import 从TAR包(tarball)中导入内容来创建一个文件系统镜像
inspect 显示镜像的更详细信息
load 从TAR包或STDIN中加载镜像
ls 列出镜像
prune 删除未使用的镜像
pull 拉取一个镜像或档案
push 推送一个镜像或档案
rm 删除镜像
save 将一个或多个镜像保存到TAR包文件 (默认硫化到STDOUT)
tag 创建一个TAG
4.2.容器
4.2.1.容器创建
? 创建一个容器,但并不运行:容器名称为msavskit_db,基于镜像ubuntu:20.04,且挂载了/etc/mscore和/usr/local/msresource两个数据卷,数据卷名称分别为msavskit_etc和msresource。使用数据卷可以将数据持久化到主机硬盘。
sudo docker create --name msavskit_db -v msavskit_etc:/etc/mscore -v msresource:/usr/local/msresource ubuntu:20.04
--name 定义被创建容器的名称;
-v 创建数据卷,格式<名称>:<容器内路径>。若不指定名称,将随机分配一个64位的名称;
4.2.2.容器运行
? 创建并运行一个容器:容器名称为msavskit,基于镜像msavskit:01.01.01.38;对外开发端口为8070,8090,8010,8020,映射的端口为8070;使用数据卷容器msavskit_db;
sudo docker run -it --name msavskit -p:8070:8060 -p 8090:8090 -p 8010:8010 -p 8020:8020 --volumes-from msavskit_db msavskit:01.01.01.38
-t 让 Docker 这个容器分配一个伪终端;
-i 打开了交互模式;
-d 让容器运行在后台;
--name 定义被创建容器的名称;
-p 指定端口映射<对外端口>:<容器内端口>
--volumes-from 指定使用的数据卷容器
4.2.3.容器退出
exit
4.2.4.容器查看
sudo docker ps
无参数 列出正在运行的容器;
-a 列出所有容器;
-l 列出最后创建的容器;
-n <n> 列出n个最近创建的容器;
-f "key=value" 进行多种形式的过滤
4.2.5.容器删除
sudo docker rm -v [容器ID或名称]
4.2.6.启动和关闭容器
sudo docker start msavskit
sudo docker stop msavskit
|