centos7 上Docker 20.10的安装和配置使用

centos7 上Docker 20.10的安装和配置使用

1. 安装

1.1 安装需要的软件包,yum-util 提供yum-config-manager功能

yum install -y yum-utils

1.2 设置docker软件的yum阿里云

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

1.3 安装docker

yum install docker-ce docker-ce-cli containerd.io

或者安装指定版本

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

1.4 启动docker

systemctl start docker

2 测试是否正确安装

尝试运行 hello-world 的image.

docker run hello-world

3. 启动等相关命令(root用户下)

# 启动 docker
systemctl start docker
# 停止 docker
systemctl stop docker
# 重启 docker
systemctl restart docker
# 设置开机启动
systemctl enable docker
# 查看 docker 状态
systemctl status docker
# 查看docker内容器的运行状态
docker stats
查看 docker 概要信息
docker info
# 查看docker 帮助文档
docker --help
# 查看docker 版本
docker -v  
docker version

4 配置镜像加速

中国科学技术大学的开源镜像 https://docker.mirrors.ustc.edu.cn

网易的开源镜像: https://hub-mirror.c.163.com

4.1 编辑daemon.json

vim /etc/docker/daemon.json

没有这个文件则新建,在文件中输入一下内容并保存。

{
    "registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}

重新加载配置信息及重启 docker 服务

# 重新加载某个服务的配置文件
systemctl daemon-reload
# 重启docker
systemctl restart docker

5. docker 相关命令

5.1 镜像相关命令

镜像存放在docker宿主机的 /var/lib/docker目录下

# 查看镜像
docker images
# 搜索镜像
docker search 镜像名称
# 拉取镜像,默认拉取least 设置 redis:5 指定版本
docker pull 镜像名称
# 删除镜像
docker rmi 镜像ID

5.2 容器相关的命令

5.2.1 查看容器相关
# 查看容器
docker ps
# 查看停止的容器
docker ps -f status=exited
# 查看所有容器
docker ps -a
# 帮助
docker ps --help
5.2.2 创建与启动容器
docker run [options] IMAGE [command] [arg...]
  • -i 表示运行容器
  • -t 表示容器启动后进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端
  • --name 为创建的容器命名
  • -v表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。
    注意:最好做目录映射,在宿主机上做修改,然后共享到容器上
  • -d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建容器后就会自动进容器里)
  • -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射
  • -P 随机使用宿主机的可用端口与容器内暴露的端口映射
5.2.2.1 创建并进入容器
docker run -it --name 容器名称 镜像名称:标签 /bin/bash

此命令表示: 通过镜像A创建容器B,运行并进入容器的/bin/bash

注意:docker 容器运行必须有一个前台进程,如果没有前台进程执行,容器认为是空闲状态,就会自动退出。

例如

# 将容器命名为mynginx,将本机80端口映射到容器80端口上
docker run --name mynginx -p 80:80 nginx
# 将本机随机端口映射到容器暴露端口上
docker run --name mynginx -P nginx
# 运行进入命令行
docker run -it --name mycentos -P centos
5.2.2.2 守护方式创建容器
docker run -di --name 容器名称 镜像名称:标签

例如

# 后台运行
docker run -di --name mynginx -p 80:80 nginx

# 登录守护是容器方式
docker exec -it 容器名称|容器ID /bin/bash
5.2.3 停止与启动容器
# 停止容器
docker stop 容器名称|容器ID

# 启动容器
docker start 容器名称|容器ID
5.2.4 文件拷贝
# 文件拷贝到容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录

# 文件从容器中拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
5.2.5 目录挂载(容器数据卷操作)

将宿主机目录与容器目录进行映射,两者之间相互影响,可实现备份功能

创建容器添加-v参数,格式为宿主机目录:容器目录,例如:

docker run -di -v /mydata/docker_data:/usr/local/data --name mycentos7 centos:7

# 多目录挂载
docker run -di -v /宿主目录:/容器目录 -v /宿主目录2:/容器目录2 镜像名

目录挂载操作可能出现权限不足的提示。这是因为CentOS7中的安全模块SELinux把权限禁掉了,在docker run 时通过-pricileged=true 给该容器加权限来解决挂载的目录没有权限的问题。

5.2.5.1 匿名挂载

匿名挂载只需要写容器目录即可,容器外对应的目录会在/var/lib/docker/volumes中生成

# 匿名挂载
docker run -di -v /usr/local/data --name centos7-01 centos:7

# 查看 volume 数据卷信息
docker volume ls
# 或者
ls /var/lib/docker/volumes/
5.2.5.2 具名挂载

具名挂载就是给数据卷起个名字,容器外对应的目录会在/var/lib/docker/volumes中生成

# 具名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-01 centos:7

# 查看 volume 数据卷信息
docker volume ls
5.2.5.3 指定目录挂载
docker run -di -v /mydata/docker_data:/usr/local/data --name centos7-02 centos:7
5.2.5.4 查看目录挂载关系

通过docker volume inspect 数据卷名称 可以查看改数据卷对应宿主机的目录

docker colume inspect docker_centos_data

通过docker inspect 容器ID或名称,查看容器详细配置信息,在返回json中找到Mounts,可以查看详细的数据挂载信息

5.2.5.5 只读 / 读写
# 只读:只能通过修改宿主机内容实现对容器的数据管理
docker run -it -v /宿主机目录:/容器目录:ro 镜像名

# 读写:默认。双向操作
docker run -it -v /宿主机目录:/容器目录:rw 镜像名
5.2.5.6 volumes-form (继承)
# 容器 centos7-01 指定目录挂载
docker run -di -v /mydata/centos_data:/usr/local/data --name centos7-01 centos:7

# 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
docker run -di --volumes-form centos7-01 --name centos7-04 centos:7
docker run -di --volumes-form centos7-01:rw --name centos7-05 centos:7
5.2.6 查看容器IP地址

查看容器的元信息

docker inspect 容器名称|容器ID

# 直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器ID
5.2.6 查看容器IP地址
# 容器要在停止运行的情况下
docker rm 容器名称|容器ID
# 删除多个容器
docker rm 容器名称|容器ID  容器名称|容器ID

6 docker 镜像构建

目标:通过centos:7基础镜像,安装jdk和tomcat以后,制作成一个新的镜像mycentos:7

6.1 通过docker commit 构建

6.1.1 创建容器
# 拉取镜像
docker pull centos:7
# 创建容器
docker run -di --name centos7 centos:7
6.1.2 拷贝资源
# 将宿主机的 jdk 和tomcat 拷贝到容器
docker cp jdk-8u291-linux-i586.tar.gz mycentos:/root
docker cp apache-tomcat-9.0.50.tar.gz mycentos:/root
6.1.3 安装资源
# 进入容器
docker exec -it mycentos bash
############# 以下命令均在容器中执行 #########
# 切换至 /root 目录下
[root@3c5ad09a5149 /]# cd /root/
[root@3c5ad09a5149 ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.50.tar.gz  jdk-8u291-linux-x64.tar.gz
# 创建java 和 tomcat 目录
[root@3c5ad09a5149 ~]# mkdir -p /usr/local/java
[root@3c5ad09a5149 ~]# mkdir -p /usr/local/tomcat
# 将jdk和tomcat解压至容器指定目录中
[root@3c5ad09a5149 ~]# tar -zxf jdk-8u291-linux-x64.tar.gz -C /usr/local/java/
[root@3c5ad09a5149 ~]# tar -zxf apache-tomcat-9.0.50.tar.gz -C /usr/local/tomcat/
# 配置jdk环境变量
[root@3c5ad09a5149 ~]# vi /etc/profile
# 在文件中添加以下内容
export JAVA_HOME=/usr/local/java/jdk1.8.0_291
export PATH=$PATH:$JAVA_HOME/bin
# 重新加载配置变量文件
[root@5c11d93528f4 ~]# source /etc/profile
# 测试环境变量是否配置成功
[root@5c11d93528f4 ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
# 删除容器中的jdk和tomcat
rm -rf jdk-8u291-linux-x64.tar.gz apache-tomcat-9.0.50.tar.gz
6.1.4 构建镜像
docker commit [OPTIONS] 容器名 [REPOSITORY[:TAG]]
docker commit -a="yuqian" -m="jdk1.8 and tomcat9" centos7 yqcentos:7
  • -a 提交的作者
  • -c 使用 Dockerfile 指令来创建镜像
  • -m 提交时的说明文字
  • -p 在 commit 时,将容器暂停
6.1.5 使用构建的镜像创建容器
# 创建容器
[root@localhost salmon]# docker run -di --name yqcentos7 -p 8080:8080 yqcentos:7
31f32a0bc3e3607f526a3ec4a75499750a65aca1bf3c9a31d5e215ecd2d86114
# 进入容器
[root@localhost salmon]# docker exec -it yqcentos7 bash
# 重新加载配置文件
[root@31f32a0bc3e3 /]# source /etc/profile
[root@31f32a0bc3e3 /]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
# 启动 tomcat
[root@31f32a0bc3e3 ~]# /usr/local/tomcat/apache-tomcat-9.0.50/bin/startup.sh
# 本地访问 ok

6.2 通过Dockerfile 构建

6.2.1 Dockerfile 常用指令
6.2.1.1 FORM

语法: FORM <image>:<tag>

指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag,那么默认值为latest

FORM centos:7

如果不以任何镜像为基础,那么写法为:FORM scratch。官方说明:scratch 镜像是一个空镜像,可以用于构建busybox等超小镜像,可以说是真正的从零开始构建属于自己的镜像。

6.2.1.2 LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...

为镜像指定标签,也可以指定镜像作者

LABEL maintainer="xxx.com"
6.2.1.3 RUN
RUN <command>

构建镜像是运行的Shell命令,比如构建的新镜像中在/usr/local目录下创建一个java目录

RUN mkdir -p /usr/local/java
6.2.1.4 ADD
ADD [--chown=<user>:<group>] <src>... <dest>

拷贝文件或目录到镜像中。src可以是一个本地文件或压缩文件,压缩文件会自动解压。还可以是一个url,则ADD就类似于wget命令,然后自动下载和解压。

ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
6.2.1.5 COPY
COPY [--chown=<user>:<group>] <src>... <dest>

拷贝文件或目录到镜像中。用法同ADD,但是不支持自动下载和解压

COPYjdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
6.2.1.6 EXPOST
EXPOSE <port> [<port>/<protocol>...]

暴露容器运行时的监听端口给外部,可以指定端口是监听TCP还是UDP,如果未指定协议,则默认是TCP。

EXPOSE 80 443 8080/tcp

如果想使用容器与宿主机的端口有映射关系,必须在容器启动的时候加上 -P 参数

6.2.1.7 ENV
ENV <key>=<value> ...

给容器添加环境变量。

ENV JAVA_HOME /usr/local/java/jdk-11.0.6
6.2.1.8 CMD

语法:

  • CMD ["executable","param1","param2"] 比如:CMD [ "/usr/local/tomcat/bin/catalina.sh", "run" ]
  • CMD ["param1","param2"] 比如:CMD [ "echo" , "$JAVA_HOME" ]
  • CMD command param1 param2 比如:CMD echo $JAVA_HOME
    启动容器时执行的shell命令。在Dockerfile中只能有一条CMD指令。如果设置了多条CMD,只有最后一条会生效。

如果创建容器的时候指定了命令,则CMD命令会被替代。例如:docker run -it --name centos7 centos:7 echo "helloworld"docker run -it --name centos7 centos:7 /bin/bash,就不会输出 $JAVA_HOME 的环境变量。因为被echo "helloworld"/bin/bash 覆盖了。

6.2.1.9 ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"]
# 或者执行单条
ENTRYPOINT command param1 param2

启动容器时执行的shell命令,同CMD类似,不会被docker run 命令行指定的参数所覆盖,在Dockerfile中只能有一条ENTRYPOINT指令,如果设置了多条,这只有最后一条生效

ENTRYPOINT [ "/usr/local/tomcat/bin/catalina.sh", "run" ]
# 或
ENTRYPOINT   echo $JAVA_HOME
  • 如果在Dockerfile中同时写了 ENTRYPOINT 和 CMD,并且CMD 指令不是一个完整的可执行命令,那么CMD 指令的内容将会作为ENTRYPOINT 的参数;
  • 如果CMD是一条完整的指令,则他两会相互覆盖,谁在最后谁生效
6.2.1.10 WORKDIR
WORKDIR /path/to/workdir

为RUN、CMD、ENTRYPOINT以及COPY 和AND 设置工作目录

WORKDIR /usr/local
6.2.1.11 VOLUME
# 容器的 /var/lib/mysql 目录会在运行时自动挂载匿名卷,匿名卷在宿主机的 /var/lib/docker/volumes 目录下
VOLUME ["/var/lib/mysql"]

指定容器挂在点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时。

一般不会在Dockerfile中使用,更常见的是在 docker run的时候通过-v指定数据卷

6.2.2 构建镜像

通过Dockerfile文件的形式完成上面的镜像整合jdk和tomcat 的过程

[root@localhost ~]# mkdir -p /usr/local/dockerfile/
[root@localhost ~]# cd /usr/local/dockerfile/
[root@localhost dockerfile]# vim Dockerfile
## 编写一下内容
# 指明构建的新镜
FROM centos:7
LABEL maintainer="yq"
WORKDIR /usr/local
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
ADD jdk-8u291-linux-x64.tar.gz /usr/local/java
ADD apache-tomcat-9.0.50.tar.gz /usr/local/tomcat
EXPOSE 8080
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_291
ENV PATH=$PATH:$JAVA_HOME/bin
CMD ["/usr/local/dockerfile/apache-tomcat-9.0.50/bin/catalina.sh", "run"]
# 保存并退出
## 构建镜像,‘.’表示需要拷贝的资源文件的目录
[root@localhost dockerfile]# docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 .
Sending build context to Docker daemon  156.4MB
Step 1/10 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/10 : LABEL maintainer="yq"
 ---> Using cache
 ---> 4a4dd2650043
Step 3/10 : WORKDIR /usr/local
 ---> Using cache
 ---> a3650baca6e4
Step 4/10 : RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
 ---> Using cache
 ---> b6fb9f929850
Step 5/10 : ADD jdk-8u291-linux-x64.tar.gz /usr/local/java
 ---> 82f48d4101a9
Step 6/10 : ADD apache-tomcat-9.0.50.tar.gz /usr/local/tomcat
 ---> d3509e036daa
Step 7/10 : EXPOSE 8080
 ---> Running in 2d28e4714ef4
Removing intermediate container 2d28e4714ef4
 ---> afa1afc2a441
Step 8/10 : ENV JAVA_HOME=/usr/local/java/jdk1.8.0_291
 ---> Running in 694e33249237
Removing intermediate container 694e33249237
 ---> 1fbc5bcbff2a
Step 9/10 : ENV PATH=$PATH:$JAVA_HOME/bin
 ---> Running in e93ea8c87c0c
Removing intermediate container e93ea8c87c0c
 ---> e1c5534fe791
Step 10/10 : CMD ["/usr/local/dockerfile/apache-tomcat-9.0.50/bin/catalina.sh", "run"]
 ---> Running in 2b7ccc4c7e43
Removing intermediate container 2b7ccc4c7e43
 ---> 06fb945f458b
Successfully built 06fb945f458b
Successfully tagged mycentos:7
[root@localhost dockerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mycentos     7         06fb945f458b   5 seconds ago   579MB
centos       7         8652b9f0cb4c   7 months ago    204MB
[root@localhost dockerfile]# docker run -di --name mycentos7 -p 8080:8080 mycentos:7
## 运行成功,可直接访问http://localhost:8080/

7 镜像备份和恢复

7.1 备份

使用docker save将指定镜像保存成tar包

docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o  /root/mycentos7.tar mycentos:7
  • -o 镜像打包后的归档文件输出的目录

7.2 恢复

使用docker load将镜像归档文件导入

docker load [OPTIONS] 
docker load -i mycentos7.tar
  • --input, -i 指定的导入文件
  • --quiet, -q 精简输出信息

8 私有镜像仓库的搭建及认证

8.1 拉取私有仓库镜像

docker pull registry

8.2 修改配置文件

vim /etc/docker/daemon.json 
# 添加以下内容
"insecure-registries": ["192.168.1.104:5000"]

文件完整内容如图:
在这里插入图片描述
重新加载配置及重启Docker服务

[root@localhost dockerfile]# systemctl daemon-reload 
[root@localhost dockerfile]# systemctl restart docker

8.3 创建私有仓库容器

[root@localhost dockerfile]# docker run -di --name localregistry -p 5000:5000 -v /docker_data/registry_data:/var/lib/registry registry

打开浏览器输入:http://192.168.1.104:5000/v2/_catalog 看到 { "repositories": [] } 表示私有仓库搭建成功并且为空。

8.4 推送镜像至私有仓库

# 先给镜像设置标签
[root@localhost dockerfile]# docker tag hello-world:latest 192.168.1.104:5000/test-hello-world:1.0.0
# 再将镜像推送至私有仓库
[root@localhost dockerfile]# docker push 192.168.1.104:5000/test-hello-world:1.0.0 

刷新浏览器可以看到私有仓库上已新上传的镜像。
在这里插入图片描述
拉取本地仓库镜像

docker run -it --name hello 192.168.1.104:5000/test-hello-world:1.0.0

8.4 推送镜像至私有仓库

[root@localhost dockerfile]# docker tag hello-world:latest 192.168.1.104:5000/test-hello-world:1.0.0
[root@localhost dockerfile]# docker push 192.168.1.104:5000/test-hello-world:1.0.0 
The push refers to repository [192.168.1.104:5000/test-hello-world]
f22b99068db9: Pushed 
1.0.0: digest: sha256:1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792 size: 525

8.5 配置私有仓库认证(保证安全性)

# 创建证书存储目录
[root@localhost ~]# mkdir -p /usr/local/registry/certs
# 生成自签名证书命令
[root@localhost ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
Generating a 2048 bit RSA private key
...........................................................................................+++
.....+++
writing new private key to '/usr/local/registry/certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:hz
Locality Name (eg, city) [Default City]:hz
Organization Name (eg, company) [Default Company Ltd]:salmon
Organizational Unit Name (eg, section) []:salmon
Common Name (eg, your name or your server's hostname) []:192.168.1.104
Email Address []:monoplasty@sina.com
[root@localhost ~]# ls /usr/local/registry/certs/
domain.crt  domain.key
生成鉴权密码文件
# 创建存储鉴权密码文件目录
[root@localhost ~]# mkdir -p /usr/local/registry/auth
# 没有htpassed功能需要安装httpd
[root@localhost ~]# yum install -y https
# 创建用户名和密码
[root@localhost ~]# htpasswd -Bbn root 1234 > /usr/local/registry/auth/htpasswd

htpasswd 是apache http 的基本认证文件,使用htpasswd命令可以生成用户及密码文件。

创建待认证的私有仓库容器
[root@localhost ~]# docker run -di --name localregistry -p 5000:5000 \
> -v /docker_data/registry_data/:/var/lib/registry \
> -v /usr/local/registry/certs:/certs \
> -v /usr/local/registry/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
> registry

认证之后,则无法浏览器访问,推送到私有仓库出现no basic auth credentials

登录到私有仓库
[root@localhost docker_data]# docker login 192.168.1.104:5000
Username: root
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
推送镜像至私有仓库
[root@localhost docker_data]# docker tag hello-world:latest 192.168.1.104:5000/test-hello-world:1.0.0
[root@localhost docker_data]# docker push 192.168.1.104:5000/test-hello-world:1.0.0
The push refers to repository [192.168.1.104:5000/test-hello-world]
f22b99068db9: Pushed 
1.0.0: digest: sha256:1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792 size: 525
退出账户
[root@localhost docker_data]# docker logout 192.168.1.104:5000
Removing login credentials for 192.168.1.104:5000
  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值