# 1、离线安装docker 因为有部分服务器在全内网环境,不能联网安装 `Docker`。这时要在服务器上安装 `Docker` 就只能下载对应安装包,离线安装 `Docker` 需要 `docker-engine`、`docker-engine-selinux`、`libtool-ltdl`这三个软件包。 下面以安装 `Docker 1.12.6` 为例讲讲如何在离线环境中安装 `Docker`,首先我们要下载对应的 `Docker` 软件包,下面的地址是官方提供的软件仓库地址,里面有各个版本的 `Docker` 软件包。 ``` # CentOS https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ http://mirror.centos.org/centos/7/extras/x86_64/Packages/ ``` `Docker` 安装需要依赖 `libtool-ltdl` 软件包,`libtool-ltdl`可在`pkgs.org`这个网站搜索下载。 - 在 CentOS 7 下安装 ``` $ mkdir docker_install $ cd docker_install $ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.6-3.el7.x86_64.rpm $ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.4.4-3.1.el7.x86_64.rpm $ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-20.10.6-3.el7.x86_64.rpm $ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-rootless-extras-20.10.6-3.el7.x86_64.rpm $ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm $ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-scan-plugin-0.7.0-3.el7.x86_64.rpm $ wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.119.1-1.c57a6f9.el7.noarch.rpm $ rpm -ivh container-selinux-2.21-1.el7.noarch.rpm $ rpm -ivh docker-ce-17.06.2.ce-1.el7.centos.x86_64.rpm $ rpm -ivh *.rpm ``` ## 1.1.CentOS7修改Docker镜像默认存储位置 ##### 1.1.1停止docker服务 ```bash # systemctl stop docker ``` ##### 1.1.2修改docker服务启动文件 ```bash # vim /etc/sysconfig/docker OPTIONS='--selinux-enabled --log-driver=journald --graph=/docker --signature-verification=false --insecure-registry 192.168.1.1' #--insecure-registry 192.168.1.1这是仓库地址可以忽略 # /docker这个目录就是我用于替代默认/var/lib/docker的目录,目录创建好之后记得“mv /var/lib/docker/* /docker/”,把所有原先目录下所有的文件和目录拷贝到新目录下。 ``` ##### 1.1.3重新加载配置并启动 ```bash # systemctl daemon-reload # systemctl start docker # systemctl enable docker ``` ##### 1.1.4检查docker信息 ```bash # docker info # docker version ``` ## 1.2Docker 过程中经常会被使用到的一些命令 ## 容器生命周期管理 ### 创建容器 ``` docker run [OPTIONS] IMAGE [COMMAND] [ARG...] ``` 因为创建命令涉及了容器运行时几乎所有的设置,所有 `run` 命令具有比其他任何 `docker` 命令更多的选项,接下来主要看一下具体的 `[OPTIONS]` 有哪些 - `-a stdin` : 指定标准输入输出内容类型,可选 `STDIN`/`STDOUT`/`STDERR` 三项 - `-d` : 后台运行容器,并返回容器ID - `-i` : 以交互模式运行容器,通常与 -t 同时使用 - `-P` : 随机端口映射,容器内部端口随机映射到主机的高端口 - `-p` : 指定端口映射,格式为:主机(宿主)端口:容器端口 - `-t` : 为容器重新分配一个伪输入终端,通常与 -i 同时使用 - `--name string` : 为容器指定一个名称 - `--dns 8.8.8.8` : 指定容器使用的DNS服务器,默认和宿主一致 - `--dns-search example.com` : 指定容器DNS搜索域名,默认和宿主一致 - `-h "mars"` : 指定容器的hostname - `-e username="ritchie"` : 设置环境变量 - `--env-file=[]` : 从指定文件读入环境变量 - `--cpuset-cpus string` : 绑定容器到指定 CPU 运行("0-2"/"0,1,2") - `-m` : 设置容器使用内存最大值 - `--net="bridge"` : 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 - `--link=[]` : 添加链接到另一个容器 - `--expose=[]` : 开放一个端口或一组端口 - `--volume , -v` : 绑定一个卷 命令有点多,一般情况,启动一个服务,常用的几个参数 - `-d`: 后台运行 - `-v`:绑定卷 例如 `-v /opt/server/logs:/opt/logs`, 简单点说,就是将容器里的 `/opt/logs` 地址和宿主机 `/opt/server/logs` 的地址绑定,类似于挂载,用户就可以通过宿主机 `/opt/server/logs` 路径直接查看容器里生成的文件 - `--name string` 声明容器的名称,建议启动的时候自己指定,便于后期启动停止可以通过容器名称直接控制 - `-p 8100:8000` 端口映射,宿主机 `8100`,容器 `8000`, 这样发送到宿主机 `8100` 端口的消息,就会由 `docker` 转发到容器 `8000` 端口, 供容器里的服务监听 - `-e ENV_LOGLEVALE=info` 声明一个可以让容器里识别到的环境变量,服务需要用户设置的一些信息,都可以通过定义成环境变量的形式在创建的时候传入容器 ### 启动/停止/重启 ``` docker start [OPTIONS] CONTAINER [CONTAINER...] docker stop [OPTIONS] CONTAINER [CONTAINER...] docker restart [OPTIONS] CONTAINER [CONTAINER...] ``` 日常使用过程中,这3个命令里的 `[OPTIONS]` 都没有使用到,一般都是直接后接容器名,例如 ``` docker start redis-server ``` ### 暂停/恢复 - `docker pause` : 暂停容器中所有的进程。 - `docker unpause` : 恢复容器中所有的进程。 ``` docker pause CONTAINER [CONTAINER...] docker unpause CONTAINER [CONTAINER...] ``` ### 删除容器 删除一个或多少容器。 ``` docker rm [OPTIONS] CONTAINER [CONTAINER...] ``` `OPTIONS` 说明: - `-f` : 强制删除一个运行中的容器 - `-l` : 移除容器间的网络连接,而非容器本身 - `-v` : 删除与容器关联的卷 ``` docker rm -f mysql ``` ### 在运行的容器中执行命令 ``` docker exec [OPTIONS] CONTAINER COMMAND [ARG...] ``` `OPTIONS` 说明: - `-d` : 分离模式: 在后台运行 - `-i` : 即使没有附加也保持 `STDIN` 打开 - `-t` : 分配一个伪终端 简单点说,**可以进入容器里**,在容器的环境下,输入一些命令,就类似于 `ssh` 到别人的机器上 其中 `OPTIONS` 的中 `-d` 的作用不详,但是输入命令需要 `-t`, 看到命令执行结果需要 `-i`, 所以在实际使用过程中,一般都是 `-it` 一起使用,也就是下面这样的 ``` docker exec -it redis-server /bin/sh ``` ## 容器操作 ### 列出容器 ``` docker ps [OPTIONS] ``` `OPTIONS` 说明: - `-a` : 显示所有的容器,包括未运行的 - `-f` : 根据条件过滤显示的内容 - `--format` : 指定返回值的模板文件 - `-l` : 显示最近创建的容器 - `-n` : 列出最近创建的n个容器 - `--no-trunc` : 不截断输出(容器ID完整显示) - `-q` : 只显示容器编号 - `-s` : 额外显示容器大小 列出所有在运行的容器信息。 ``` docker ps ``` 输出详情介绍: - `CONTAINER ID` : 容器 ID - `IMAGE` : 使用的镜像 - `COMMAND` : 启动容器时运行的命令 - `CREATED` : 容器的创建时间 - `STATUS` : 容器状态。状态有 7 种 - - `created`(已创建) - `restarting`(重启中) - `running`(运行中) - `removing`(迁移中) - `paused`(暂停) - `exited`(停止) - `dead`(死亡) - `PORTS` : 容器的端口信息和使用的连接类型(tcp\udp) - `NAMES` : 自动分配的容器名称 ### 查看容器详情 获取容器/镜像的元数据,元数据包括容器的 id、创建时间、运行状态、启动参数、目录挂载、网路配置等等。注意,该命令也可以用来查看镜像的信息。 ``` docker inspect [OPTIONS] NAME|ID [NAME|ID...] ``` `OPTIONS` 说明: - `-f (--format)` : 指定返回值的 go 模板文件 - `-s` : 显示总的文件大小。 - `--type` : 指定类型,用于指定 `docker` 对象类型,如:`container`、`image`。在容器与镜像同名时可以使用。默认返回容器信息 直接 `docker inspect 容器名` 会返回特别多的信息,这时候就需要使用 `-f` 来做一步筛选 格式如下, 这里的key 指的是 `docker inspect 容器名` 返回结果里的 `key` 值 ``` docker inspect -f "{{json .key}}" 容器名 # 方便看json, 使用 jq docker inspect -f "{{json .key}}" 容器名 | jq ``` 举个例子 ``` # 查看容器 redis-server 的容器ID docker inspect -f "{{json .ID}}" redis-server # 查看容器 redis-server 的挂载信息 docker inspect -f "{{json .Mounts}}" redis-server | jq # 查看容器 redis-server 的网络设置中网络信息 docker inspect -f "{{json .NetworkSettings.Networks}}" redis-server | jq ``` ### 获取日志 ``` docker logs [OPTIONS] CONTAINER ``` `OPTIONS` 说明: - `-f` : 跟踪日志输出,实时显示 - `--since` : 显示某个开始时间的所有日志 - `-t` : 显示时间戳 - `--tail N` : 仅列出最新 N 条容器日志 查看容器 `redis-server` 从 2020 年 12 月 30 日后的最新 10 条日志, 并且实时显示最新的日志输出。 ``` docker logs -f --since="2020-12-30" --tail 10 redis-server ``` ### 数据拷贝 用于容器与主机之间的数据拷贝。 ``` # 从容器中拷贝出来 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- # 拷贝到容器中 docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH ``` `OPTIONS` 说明: - `-L` : 保持源目标中的链接 ## 镜像管理 一般情况下很少涉及到对镜像管理,但是这里简单介绍一些 ### 列出本地镜像 ``` docker images [OPTIONS] [REPOSITORY[:TAG]] ``` OPTIONS 说明: - `-a` : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层) - `--digests` : 显示镜像的摘要信息 - `-f` : 显示满足条件的镜像 - `--format` : 指定返回值的模板文件 - `--no-trunc` : 显示完整的镜像信息 - `-q`: 只显示镜像ID 列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表。 ``` docker images ubuntu ``` ### 删除镜像 删除本地一个或多少镜像。 ``` docker rmi [OPTIONS] IMAGE [IMAGE...] ``` `OPTIONS` 说明: - `-f`: 强制删除 - `--no-prune` : 不移除该镜像的过程镜像,默认移除 强制删除本地镜像 runoob/ubuntu:v4。 ``` docker rmi -f runoob/ubuntu:v4 ``` ### 标记本地镜像/重命名 标记本地镜像,将其归入某一仓库。 ``` docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] ``` 将镜像 `ubuntu:15.10` 标记为 `runoob/ubuntu:v3` 镜像。 ``` docker tag ubuntu:15.10 runoob/ubuntu:v3 ``` ### 导出镜像 将指定镜像保存成 tar 归档文件。 ``` docker save [OPTIONS] IMAGE [IMAGE...] ``` `OPTIONS` 说明: - `-o` : 输出到的文件 将镜像 `runoob/ubuntu:v3` 生成 `my_ubuntu_v3.tar` 文档。 ``` docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3 docker save runoob/ubuntu:v3 > my_ubuntu_v3.tar ``` ### 导入镜像 导入使用 `docker save` 命令导出的镜像。 ``` docker load [OPTIONS] ``` `OPTIONS` 说明: - `--input, -i` : 指定导入的文件,代替 STDIN - `--quiet, -q` : 精简输出信息 从 `busybox.tar.gz` 导入镜像。 ``` docker load < busybox.tar.gz ``` 指定导入文件 `busybox.tar` 导入镜像。 ``` docker load -i busybox.tar ``` ## 小技巧 ``` # 删除所有容器 docker rm -f $(docker ps -aq) # 筛选出所有含有 k8s 字段的容器 docker ps -a | grep k8s # 同理,删除满足条件 (含有 k8s 字段) 的容器 docker rm -f $(docker ps -a | grep k8s | awk -F ' ' '{print $1}') ``` Linux 下管道还是很强大的,前一个命令的输出作为后一个命令的输入,因此 `grep` , `awk` 等等都是可以配合使用的 同时也可以将命令的输出结果作为变量,供另一个命令使用 ## 1.3、常用docker命令 ### 1.3.1、查看docker信息 ###### 1、查看docker版本 ``` docker version ``` ###### 2、显示docker系统的信息 ``` docker info ``` ### 1.3.2、对image的操作 ###### 1、检索image ``` docker search image_name ``` ###### 2、下载image ``` docker pull image_name ``` ###### 3、列出镜像列表 ``` docker images ``` ###### 4、删除一个或者多个镜像 ``` docker rmi image_name ``` ###### 5、显示一个镜像的历史 ``` docker history image_name ``` ### 1.3.3、启动容器 ###### 1、在容器中运行”echo”命令,输出”hello word” ``` docker run image_name echo "hello word" ``` ###### 2、交互式进入容器中 ``` docker run -i -t image_name /bin/bash ``` ###### 3、在容器中安装新的程序 ``` docker run image_name apt-get install -y app_name ``` ### 1.3.4、查看容器 ###### 1、列出当前所有正在运行的container ``` docker ps ``` ###### 2、列出所有的container ``` docker ps -a ``` ###### 3、列出最近一次启动的container ``` docker ps -l ``` ### 1.3.5、保存对容器的修改 ###### 1、保存对容器的修改 ``` docker commit ID new_image_name ``` ### 1.3.6、对容器的操作 ###### 1、删除所有容器 ``` docker rm `docker ps -a -q` ``` ###### 2、删除单个容器 ``` docker rm Name/ID ``` ###### 3、 停止、启动、杀死一个容器 ``` $docker stop Name/ID $docker start Name/ID $docker kill Name/ID ``` ###### 4、从一个容器中取日志 ``` docker logs Name/ID ``` ###### 5、列出一个容器里面被改变的文件或者目录 ``` docker diff Name/ID ``` ###### 6、显示一个运行的容器里面的进程信息 ``` docker top Name/ID ``` ###### 7、从容器里面拷贝文件/目录到本地一个路径 ``` docker cp Name:/container_path to_path docker cp ID:/container_path to_path ``` ###### 8、重启一个正在运行的容器 ``` docker restart Name/ID ``` ###### 9、附加到一个运行的容器上面 ``` docker attach ID ``` ### 1.3.7、 保存和加载镜像 ###### 1、保存镜像到一个tar包 ``` docker save image_name -o file_path ``` ###### 2、加载一个tar包格式的镜像 ``` docker load -i file_path ``` ### 1.3.8、 登录registry server ###### 1、登陆registry server ``` docker login ``` ### 1.3.9、发布image ###### 1、发布docker镜像 ``` docker push new_image_name ``` **Docker镜像拉取** ``` root@linuxcool:~# docker pull mysql:5.6 5.6: Pulling from library/mysql e62d08fa1eb1: Pull complete Digest: sha256:60c27b50ca72d81d92a743a965a82f124a4e123c7d374a021887286408878d60 Status: Downloaded newer image for mysql:5.6 docker.io/library/mysql:5.6 ``` **Docker容器备份** ``` root@linuxcool:~# docker image save mysql:5.6 -o mysql:5.6.tar.gz mysql:5.6 mysql:5.6.tar.gz ``` **Docker容器导出** ``` root@linuxcool:~# docker save mysql:5.6 > mysql:5.6.tar.gz mysql:5.6 mysql:5.6.tar.gz ``` **Docker容器恢复** ``` root@linuxcool:~# docker image load -i mysql:5.6.tar.gz mysql:5.6.tar.gz ``` **Docker容器导入** ``` root@linuxcool:~# docker image load < mysql:5.6.tar.gz Loaded image: mysql:5.6 mysql:5.6.tar.gz ``` # 1.4、搭建需要镜像 ## 已有镜像列表 jenkins/jenkins latest 3d2f88dfa0ea 16 hours ago 572MB gitlab/gitlab-ce latest e5894d9173ec 7 days ago 2.21GB portainer/portainer latest 580c0e4e98b0 4 weeks ago 79.1MB sonatype/nexus3 latest f07af611e0df 6 weeks ago 662MB idoop/zentao latest 2d8b2ca2e0d7 2 months ago 188MB mysql 5.7 a70d36bc331a 3 months ago 449MB rabbitmq 3.8.9 7471fb821b97 3 months ago 167MB redis 6.0.9 6060df96cef3 3 months ago 104MB nginx 1.19.4 daee903b4e43 5 months ago 133MB registry 2.4.1 8ff6a4aae657 4 years ago 172MB java 8 d23bdf5b1b1b 4 years ago 643MB ## 导出需要的镜像 docker save java -o /opt/images/java.tar.gz docker save gitlab/gitlab-ce -o /opt/images/gitlab-ce.tar.gz docker save portainer/portainer -o /opt/images/portainer.tar.gz docker save sonatype/nexus3 -o /opt/images/nexus3.tar.gz docker save idoop/zentao -o /opt/images/zentao.tar.gz docker save mysql -o /opt/images/mysql.tar.gz docker save rabbitmq -o /opt/images/rabbitmq.tar.gz docker save redis -o /opt/images/redis.tar.gz docker save nginx -o /opt/images/nginx.tar.gz docker save registry -o /opt/images/registry.tar.gz docker save jenkins/jenkins -o /opt/images/jenkins.tar.gz docker commit ca0037d8a147 jenkins/jenkins docker save jenkins/jenkins -o /opt/data/jenkins.tar.gz ## 加载需要的镜像 docker load -i /opt/images/java.tar.gz docker load -i /opt/images/gitlab-ce.tar.gz docker load -i /opt/images/portainer.tar.gz docker load -i /opt/images/nexus3.tar.gz docker load -i /opt/images/zentao.tar.gz docker load -i /opt/images/mysql.tar.gz docker load -i /opt/images/rabbitmq.tar.gz docker load -i /opt/images/redis.tar.gz docker load -i /opt/images/nginx.tar.gz docker load -i /opt/images/registry.tar.gz docker load -i /opt/images/jenkins.tar.gz tar -zcvf jekins.tar.gz jenkins/ tar -zxvf jekins.tar.gz -C /opt/data/ tar -zcvf data.tar.gz data/ # 2、修改yum源 **概要** 刚装完的CentOs系统里使用的是国外的CentOs更新源,这就造成了我们使用默认更新源安装或者更新软件时速度很慢的问题。 为了使用yum工具能快速的安装更新软件,我们需要将默认的yum更新源配置为国内的更新源。 ### **开启网络连接** 对于新装的CentOS,默认是没有开启网络连接的,所以你看不到IP地址。 ```text #查看有线网设备 ip address ``` 可以看到几个设备: ```text 1: lo: mtu 65536 qdisc noqueue 2: enp4s0: mtu 1500 ... ``` 那么,有线网就是叫enp4s0,(虚拟机一般为 ens33 ) ```text #打开有线网配置 vi /etc/sysconfig/network-scripts/ifcfg-enp4s0 #最后一行,修改为YES ONBOOT=YES #重启网络服务 systemctl restart network.service ``` ### **更换yum官方源** ```text #下载wget工具,一般默认有 yum install -y wget #进入yum源配置文件所在文件夹 cd /etc/yum.repos.d/ #备份本地yum源(修改或删除文件都建议备份下) mv CentOS-Base.repo CentOS-Base.repo_bak ``` 获取国内yum源进行覆盖(阿里云、163等等) ```text #以CentOs7为例,若为CentOs5/6只需要改下方数字 wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #wget -O CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo ``` 通常,yum 把下载的header和软件包都存储在/var/cache/yum目录中,而不会自动删除。如果你觉得它们占用了大量磁盘空间,可以使用yum clean指令进行清除 ```text #清理yum缓存 yum clean all #清理后重建缓存 yum makecache #升级Linux系统 yum -y update ``` ### **增加EPEL源** (Extra Packages for Enterprise Linux),为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS等,里面有1万多个软件,**强烈建议安装。** ```text #安装epel源 yum install epel-release #修改为阿里的epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo ``` **yum priorities** 插件可以用来强制保护源。它通过给各个源设定不同的优先级,使得系统管理员可以将某些源(比如 Linux 发行版的官方源)设定为最高优先级,从而保证系统的稳定性(同时也可能无法更新到其它源上提供的软件最新版本)。 ```text #安装yum源优先级管理工具 yum install -y yum-priorities #添加优先级(数字越小优先级越高) vim /etc/yum.repo.d/epel.repo priority=88 #添加优先级(这个数要小于epel里的88即可) vim /etc/yum.repo.d/Centos-Base.repo priority=6 #开启yum源优先级功能 vim /etc/yum/pluginconf.d/priorities.conf #确保文件内容包含如下: [main] enabled=1 ```