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
精简输出信息
标签:容器,run,20.10,centos7,usr,镜像,docker,local,Docker 来源: https://blog.csdn.net/monoplasty/article/details/118607327