第一节:docker简介、下载安装和配置镜像加速器、以及docker、镜像、容器相关指令使用
一. docker简介
1. docker背景
我们在实际开发中,会接触到多个环境,比如:开发环境、测试环境、生产环境。经常会出现程序员在本机上运行好用的代码,迁移到测试环境中不好用了; 测试环境校验没问题的程序发布到生产环境中又出错了,然后开发、测试、运维各方人员开始扯皮,干架,出现这种情况,很大的一个原因是不同环境下所安装的Runtime时版本不同,比如开发环境中安装的是 .Net Core 3.1 ,而测试环境中安装的是.Net Core 2.2 ; 再比如测试环境中安装的是JDK8,生产环境中安装的是JDK7,就会产生“水土不服”的问题,从而报错。

docker的诞生就是为了解决这种软件跨环境迁移而出现的水土不服的问题。将发布包和运行环境一起打包在一个容器中进行迁移,就解决上述问题。

2. docker相关概念
Docker 是一个开源的应用容器引擎,诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
容器是完全使用沙箱机制,相互隔离,容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

3. 镜像、容器、仓库
(1). 镜像(Image):就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
就像软件安装包。我们可以把镜像拉(pull)下来,增加我们的更改,然后发布(push)成新的镜像,别人也可以下载我们发布的镜像,然后继续更改,继续发布;
(2). 容器(Container):镜像安装后运行的实例;同一个镜像可以在同一台服务器上安装成多个容器,同一个镜像可以同时装在多个不同的服务器上
PS:镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
(3). 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像,有公有仓库和私有仓库之分。常见的docker的官方仓库、阿里云、腾讯云等等。

4. 相关地址
docker官网:https://www.docker.com/
镜像官方地址:https://hub.docker.com/ (可以去搜索各种镜像,查询镜像的版本号等)
二. 下载安装、配置镜像加速器
环境说明
服务器:阿里云centos stream 9.0
配置:2核4G 5M带宽
1. docker下载和安装
(1) 关闭防火墙
【systemctl status firewalld】
【systemctl stop firewalld】
【systemctl status firewalld】

(2) 安装docker的依赖环境
【sudo yum install -y yum-utils device-mapper-persistent-data lvm2】
(3) 设置docker的下载地址,否则下载不下来
【sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo】

(4) 安装docker及其相关组件
【sudo yum install -y docker-ce docker-ce-cli containerd.io】
说明:
- docker-ce:Docker 社区版引擎。
- docker-ce-cli:Docker 命令行工具。
- containerd.io:容器运行时。

(5) 查看docker版本号
【docker -v】

(6) 配置镜像加速器,将下载源改为阿里云,否则从国外docker仓库下载巨慢
ps:详细步骤详见下面的3,这里直接给出代码,快速安装
步骤1:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://3pdtarw4.mirror.aliyuncs.com"]
}
EOF
步骤2:
【sudo systemctl daemon-reload】
【sudo systemctl restart docker】

(7). 开启docker自动补全 –自动补全指令(tab键补全)
先要确保docker是启动的状态 【systemctl start docker】
【yum install -y bash-completion】
【source /usr/share/bash-completion/completions/docker】
【source /usr/share/bash-completion/bash_completion】

(8) 阿里云服务器配置安全组策略,打开端口。

(9) 其他指令
设置docker开机自动启动 【sudo systemctl enable docker】
(10) 补充说明
A 【 docker search xx】 不好用,超时。
原因:即使上面镜像加速了,也只是针对 docker pull而言, docker search 依旧使用的是docker官方仓库的地址,这个没法切换到。

2. 配置镜像加速器
(1). 默认镜像的下载地址是:https://hub.docker.com/ 国外的,下载慢的要死,我们可以把它配置成国内的镜像,常见的有以下这几种:
USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
阿里云:注册登录后查看 (推荐!!!)
网易云:注册登录后查看
腾讯云:注册登录后查看
(2) . 配置阿里云的镜像加速器(都类似)
A. 登录阿里云--------进入控制台------搜索容器镜像服务并进入-------选择镜像加速器--------复制地址



B. 进入Linux系统
(1). 打开配置文件: 【vi /etc/docker/daemon.json】 默认是空的
(2). 复制下面代码到上面的文件里,进行保存
{ "registry-mirrors": ["https://阿里云复制的地址"] }
(3). 执行相关重启命令:【sudo systemctl daemon-reload 】和【sudo systemctl restart docker】
简单方法(推荐)
直接去阿里云那复制整段代码,copy到Linux系统,敲回车一步搞定。
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ijmr3it2.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
三. docker、镜像、容器相关指令使用
1. docker指令
(1). 启动docker:【sudo systemctl start docker】
(2). 停止docker:【sudo systemctl stop docker】
(3). 重启docker:【sudo systemctl restart docker】
(4). 查看docker服务状态:【sudo systemctl status docker】
(5). 设置开机启动docker:【sudo systemctl enable docker】

2. 镜像
A 相关指令:
(0). 构建镜像:docker build -t <imageName>:版本号 . (注:最后是 一个空格 和 一个点, 版本号可以省略)
ps:如果Dockerfile文件不在当前目录,或者重命名了,需要通过 -f参数指定路径。 eg:【docker build -f ./ypfcentos_Dockerfile -t ypfcentos:1.0 . 】
(1). 搜索镜像: docker search imageName
(2).下载镜像:docker pull <imageName>
下载指定版本号的镜像:docker pull imageName:版本号
PS:镜像可以去这个网站上找:https://hub.docker.com ,版本号也上这找。
(3). 查看所有映像:docker images 【等价 docker image ls】
(4). 查看所有镜像ID:docker images –q
(5). 删除指定镜像:docker rmi <imageId 或 imageName>
(6). 删除全部镜像:docker rmi $(docker images -q)
(7). 删无标签镜像:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
B. 案例:
(1). 删除系统中nginx镜像 和 redis 镜像(分别通过name 和 ID)

(2). 下载5.7版本的MySql镜像
先去仓库中查询一下有没有5.7这个版本,经查询是有的, 然后进行下载即可。


2. 容器
A. 相关指令:
(1). 运行容器:docker run 各种参数 <imageName>
PS:当本机一个镜像存在多个版本的时候需要加上版本号: docker run 各种参数 <imageName>:版本号
参数说明:
--name:指定容器名称 eg: --name=ypf 或者 --name ypf 都行
-i:保持容器运行。通常与 -t 或 -d同时使用。
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用,容器创建后自动进入容器中,退出容器后,容器自动关闭。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
-p:指定端口映射 eg: -p 5001:80 (其中5001表示docker主机《即linux系统》对外开放的端口,80表示容器对外开放的端口-dockerFile中)
-P:暴露所有端口
常用组合:
【docker run -it --name=xxx <imageName>】: 以交互式创建容器,容器创建后自动进入容器中,退出容器后,容器自动关闭。
【docker run -id --name xxx <imageName>:7】:以守护时创建容器,并且指定使用镜像的版本为7, i可以省略
【docker run --name xxx -id -p 5001:80 <imageName>】: 以守护时创建容器,并做端口映射,linux端口5001,容器端口为80
特别注意:imageName后面如果不写版本号,默认去使用最新版本的image,没有的话,去下载。
(2). 查看运行容器:docker ps 【等价 docker container ls】
查看所有容器:docker ps -a
(3). 进入容器内部:docker exec -it <containerId> /bin/bash (可省略bin,简介写法 【docker exec -it <containerId> bash】)
注:这里不能 -id
(4). 退出当前容器:exit
(5). 启动一个容器:docker start <containerId 或 containerName>
(6). 停止一个容器:docker stop <containerId 或 containerName>
停止所有容器:docker stop $(docker ps -q)
(7) 暂停一个容器:docker pause <containerId 或 containerName>
恢复一个容器:docker unpause <containerId 或 containerName>
(8). 删除单个容器:docker rm <containerId 或 containerName> (加个 -f 可以强制删除启动的容器)
删除所有容器:docker rm $(docker ps -aq)
(9). 查看容器信息:docker inspect <containerName>
(10). 查看容器日志:
docker logs [OPTIONS] 容器name/ID Options: --details 显示更多的信息 -f, --follow 跟踪实时日志 --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟) --tail string 从日志末尾显示多少行日志, 默认是all -t, --timestamps 显示时间戳 --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
假设容器的名字为test1
A. 查看所有日志
【docker logs test1】
A. 查看最近20分钟内的所有日志
【docker logs --since 20m test1】
B. 查看最近20分钟内的最新的100条日志
【docker logs --since 20m --tail 100 test1】
C. 查看最近20分钟内的最新的100条日志,并实时监控后续日志
【docker logs -f --since 20m --tail 100 test1】
D. 查询某个时间段内的日志
【docker logs --since="2020-09-17" test1】 查询20200917后的所有日志
【docker logs --since="2020-09-17" --until="2020-09-18" test1】查询20200917-20200918之间的日志
B. 案例:
(1). 用交互式的方式创建一个名为myCentos1的容器,查看是否直接进入容器,退出后容器是否关闭。

(2). 指定端口的用法
【docker run -id --name=ypfwebapicontainer1 -p 8000:9000 ypfwebapi1】

(3). 随机所有端口的用法
【docker run -id --name=test1 -P ypfwebapi1】


!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

浙公网安备 33010602011771号