上一篇Blog详细介绍了Docker为什么会出现,是为了解决什么问题而出现;Docker的基本组成部分、架构。本篇Blog就来详细了解下Docker如何安装、卸载以及常用的操作命令有哪些。因为Docker可以安装在任何物理机、虚拟机以及公有云、私有云上,而我自己购买的腾讯云服务器已经是windows系统并且运行着服务,所以还是使用自己的PC上安装的虚拟机来操作吧。虚拟机我安装的是Centos7,之前我有两篇Blog详细介绍过如何通过VMWare安装一个虚拟机集群:【分布式集群搭建 一】虚拟机配置(VMware+Centos7+SecureCRT+AppNode)和【分布式集群搭建 二】克隆虚拟机并配置集群,有需要的可以按照我之前的步骤先本地安装虚拟机,这样就不用购买云服务器了。
Docker安装
接下来就在Centos7上进行Docker的安装,使用SecureCRT进行虚拟主机控制,当然也可以使用AppNode进行可视化远程控制。
1 环境准备
首先检查下Centos7的内核版本,确认支持Docker。首先打开VMWARE,开启一个虚拟机主机:
点击打开虚拟主机CentOS-7-TML1
:
打开CentOS-7-TML1
主机后,通过SecureCRT进行虚拟主机远程控制:查看内核版本:uname -r
,可以看到内核版本大于3.10
查看系统配置:cat /etc/os-release
NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
2 Docker安装
访问Docker官方网站,按照步骤进行安装:https://docs.docker.com/
由于是在Linux下进行操作,所以直接选择Linux系统安装:
1 卸载旧版本
找到CentOS的安装文档,安装Docker的第一步是卸载旧的版本:
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
因为我的电脑之前没有安装过Docker,所以会有这样的提示:
这里简单介绍下YUM:(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。RPM是由红帽公司开发的软件包管理方式,使用RPM我们可以方便的进行软件的安装、查询、卸载、升级等工作。但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时。
2 下载需要的安装包
通过如下命令进行运行环境的安装包:yum install -y yum-utils
3 配置下载Docker的yum源
默认的Docker下载地址是国外的比较慢,可以使用国内的阿里云的yum镜像仓库:
#国外的地址 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 设置阿里云的Docker镜像仓库 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置结果如下:
4 更新yum软件包索引
安装Docker引擎前先进行yum软件包的更新:yum makecache fast
5 安装Docker引擎
安装Docker引擎的命令如下:yum install docker-ce docker-ce-cli containerd.io
:
1 如果过程中一直报差找不到镜像,用该命令清理下yum包:yum clean all
。
2 如果安装结果提示【尚未安装任何秘钥】则按照如下步骤处理:
- 查看系统版本信息
cat /etc/redhat-release
:CentOS Linux release 7.8.2003 (Core)
- 从开源站点:
http://mirrors.163.com/centos/
,找到系统对应秘钥,然后进行安装:rpm --import http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7
做完以上两个步骤后再次执行Docker安装命令:
6 启动Docker
通过如下命令启动Docker,检查Docker版本以及设置Docker开机自动启动:
systemctl start docker # 查看当前版本号,是否启动成功 docker version # 设置开机自启动 systemctl enable docker
结果如下:
7 测试Hello-World程序
安装完成后我们可以下载hello-world镜像进行测试:docker run hello-world
查看下载的hello-world镜像:docker images
3 Docker卸载
Docker的卸载命令如下:
# 1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io # 2. 删除资源 . /var/lib/docker是docker的默认工作路径 rm -rf /var/lib/docker
4 配置阿里云镜像加速
进入阿里云官网,搜索容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
使用如下命令进行镜像配置,每个人有自己独有的加速器,配置后docker的镜像下载就从这个站点下载啦,按照以下4个命令执行即可:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
国内的镜像加速器大多是采用定时同步的方式来缓存,缓存Docker Hub上的镜像。我理解原理就是加速器的站点是一个可以访问外网的代理服务器:
- 当我们pull镜像时请求不会直接发给目的主机,而是先发给代理服务器,代理服务器接受了客户的请求以后,由代理服务器向目的主机发出请求,并接受目的主机的数据,缓存于代理服务器的硬盘中,然后再由代理服务器将客户要求的数据发给客户
- 我们的主机与代理服务器通过代理服务VPN连接
这样就能做到镜像加速了,关于自己搭建镜像加速服务器可以参考这篇:https://juejin.cn/post/6933095684476403719
Docker运行流程
参照之前的Hello-world镜像拉取过程:
[root@192 ~]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly.
可以得知docker run
命令的执行流程,启动并运行一个hello-world容器。
Docker是一个Client-Server
结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令!
每个Docker容器就好像一个小的虚拟机,和主机是隔离的,容器之间互相也是隔离的。Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机是需要加载Guest OS。
Docker常用命令
包含基础命令,镜像命令以及容器命令。
1 基础命令
通过基础命令查看命令的一些帮助
docker version #查看docker的版本信息 docker info #查看docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令(可查看可选的参数) docker COMMAND --help
例如可以通过docker info
查看到现在的镜像来源是我们上边配置的阿里云镜像加速器对应地址。
命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
2 镜像命令
查看本地镜像、搜索镜像以及下载镜像,从这个站点:https://hub.docker.com/search?q=mysql&type=image
,而由于上边我们的配置,实际下载的镜像来源于阿里云的镜像加速器地址【当然该地址的镜像也都是同步自DockerHub官方镜像】
1 docker images 查看本地主机的所有镜像
[root@192 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest bf756fb1ae65 11 months ago 13.3kB #解释: 1.REPOSITORY 镜像的仓库源 2.TAG 镜像的标签 3.IMAGE ID 镜像的id 4.CREATED 镜像的创建时间 5.SIZE 镜像的大小 # 可选参数 -a/--all 列出所有镜像 -q/--quiet 只显示镜像的id
2 docker search 搜索镜像
[root@192 ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10308 [OK] mariadb MariaDB is a community-developed fork of MyS… 3819 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 754 [OK] percona Percona Server is a fork of the MySQL relati… 517 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 86 mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 79 centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK] #可选参数 Search the Docker Hub for images Options: -f, --filter filter Filter output based on conditions provided --format string Pretty-print search using a Go template --limit int Max number of search results (default 25) --no-trunc Don't truncate output #搜索收藏数大于3000的镜像 [root@192 ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 12051 [OK] mariadb MariaDB Server is a high performing open sou… 4619 [OK]
3 docker pull 镜像名[:tag] 下载镜像
[root@192 ~]# docker pull mysql Using default tag: latest #如果不写tag默认就是latest latest: Pulling from library/mysql 6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统 fedd960d3481: Pull complete 7ab947313861: Pull complete 64f92f19e638: Pull complete 3e80b17bff96: Pull complete 014e976799f9: Pull complete 59ae84fee1b3: Pull complete ffe10de703ea: Pull complete 657af6d90c83: Pull complete 98bfb480322c: Pull complete 6aa3859c4789: Pull complete 1ed875d851ef: Pull complete Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest
4 docker rmi 删除镜像
#1.删除指定的镜像id [root@192 ~]# docker rmi -f 镜像id #2.删除多个镜像id [root@192 ~]# docker rmi -f 镜像id 镜像id 镜像id #3.删除全部的镜像id [root@192 ~]# docker rmi -f $(docker images -aq)
3 容器命令
拉取容器、运行容器、进入容器、退出容器、列出运行过的容器、删除容器、启动和停止容器
1 拉取镜像
使用容器的前提是存在该镜像,所以先拉取一个centos容器:docker pull centos
2 创建并进入容器
docker run [可选参数] image #参数说明 --name="名字" 指定容器名字 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 ( -p ip:主机端口:容器端口 配置主机端口映射到容器端口 -p 主机端口:容器端口 -p 容器端口 ) -P 随机指定端口(大写的P)
1,使用交互方式运行,进入容器查看内容
交互方式下,可以运行容器并直接进入容器:
#启动并进入容器: [root@192 ~]# docker run -it centos /bin/bash [root@192 ~]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出时可以使用Ctrl+P+Q
仅退出不停止容器运行。
[root@192 ~]# docker run -it centos /bin/bash [root@1c1dd47ce82c /]# [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c1dd47ce82c centos "/bin/bash" 29 seconds ago Up 27 seconds elated_colden 945abcb48a14 tomcat "catalina.sh run" 5 minutes ago Up 5 minutes 8080/tcp quizzical_golick [root@192 ~]#
即使通过exit
退出了,再次通过docker start 容器id
也可以正确运行
2,使用后台方式运行,进入容器查看内容
如果使用后台方式进入运行,则可以通过如下命令:
[root@192 ~]# docker run -d tomcat 945abcb48a14fd229f21457d858c9c2885cc04e659aeebc26d9b13cff7ddc0fe [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 945abcb48a14 tomcat "catalina.sh run" 4 seconds ago Up 2 seconds 8080/tcp quizzical_golick
这里有个坑需要注意,除了tomcat这类后台服务自启动的情况。docker如果没有前台应用,没有提供服务就会立即自动停止,必须要有一个前台的进程,否则会自动停止。
[root@192 ~]# docker run -d centos /bin/bash 1dadd4b80c2cc31146ee37ed6408cd892ff0495e354f7635b2672a8c41a29fd5 [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c1dd47ce82c centos "/bin/bash" 5 minutes ago Up 5 minutes elated_colden 945abcb48a14 tomcat "catalina.sh run" 11 minutes ago Up 11 minutes 8080/tcp quizzical_golick [root@192 ~]#
这种情况下可以通过前台脚本一直运行的方式让它运行:
[root@192 ~]# docker run -d centos /bin/sh -c "while true;do echo tml;sleep 5;done" cc886973b2cb449191f02ec93009982d399f230950115568963ddd25e8ecad74 [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cc886973b2cb centos "/bin/sh -c 'while t…" 4 seconds ago Up 4 seconds suspicious_borg 1c1dd47ce82c centos "/bin/bash" 6 minutes ago Up 6 minutes elated_colden 945abcb48a14 tomcat "catalina.sh run" 12 minutes ago Up 12 minutes 8080/tcp quizzical_golick [root@192 ~]#
即使通过stop停止容器运行了,再次启动依然可以通过ps查到,因为有前端进程在调用着它的服务。总的来说-it
的交互模式比-d
的后台模式顽强,不需要前台服务调着也可以运行,而-d
模式比不加选项的前台进程运行模式顽强点,停了之后,只要前端有服务调着就能一直运行,而最弱的前台进程模式则只要敲新命令就退出去了,这让我想到了之前调Kafka时一直启动不了的问题了,嗨,就是因为Kafka进程没后台模式运行。
3 退出容器
#exit 停止并退出容器(后台方式运行则仅退出) #Ctrl+P+Q 不停止容器退出 [root@192 ~]# exit exit [root@192 ~]#
4 启动、停止容器
想要启动和停止容器可以使用如下命令,尤其是后台运行时。
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前运行的容器 docker kill 容器id #强制停止当前容器
5 列出容器列表
#docker ps [可选项] # 列出当前正在运行的容器 -a # 列出所有容器的运行记录 -n=? # 显示最近创建的n个容器 -q # 显示所有容器,只显示容器编号 [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@192 ~]# docker run -it centos /bin/bash [root@4a93ee953a85 /]# docker ps[root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4a93ee953a85 centos "/bin/bash" About a minute ago Up About a minute nervous_kowalevski [root@192 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bca129320bb5 centos "/bin/bash" 4 minutes ago Exited (0) 3 minutes ago optimistic_shtern bd1b8900c547 centos "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago cool_tesla cf6adbf1b506 bf756fb1ae65 "/hello" 5 hours ago Exited (0) 5 hours ago optimistic_darwin
6 删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f docker rm -f $(docker ps -aq) #强制删除所有的容器,包含运行中的 docker ps -a -q|xargs docker rm #删除所有的容器
4 其它常用命令
包括查看运行日志、查看容器中进程信息、查看容器的元数据、进入当前正在运行的容器
1 查看运行日志
[root@192 ~]# docker logs --help Usage: docker logs [OPTIONS] CONTAINER Fetch the logs of a container Options: --details Show extra details provided to logs -f, --follow Follow log output --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) -n, --tail string Number of lines to show from the end of the logs (default "all") -t, --timestamps Show timestamps --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
常用命令如下:
docker logs -tf 容器id docker logs --tail number 容器id #num为要显示的日志条数
试验一下看看:
#docker容器后台运行,必须要有一个前台的进程,否则会自动停止 #编写shell脚本循环执行,使得centos容器保持运行状态 [root@192 ~]# docker run -d centos /bin/sh -c "while true;do echo tml;sleep 5;done" c2a9905be58b87056b97c1717f4bbd53ab8fdf9626b10243797ce2601e112eb2 [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2a9905be58b centos "/bin/sh -c 'while t…" 7 seconds ago Up 6 seconds zealous_shockley 1a89c6b0a6cf centos "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes wizardly_hofstadter 3b71711140a1 centos "/bin/bash" 18 minutes ago Up 17 minutes ecstatic_brattain [root@192 ~]# docker logs -tf --tail 10 c703b5b1911f c2a9905be58b "docker logs" requires exactly 1 argument. See 'docker logs --help'. Usage: docker logs [OPTIONS] CONTAINER Fetch the logs of a container [root@192 ~]# docker logs -tf --tail 10 c2a9905be58b 2022-02-03T11:09:37.007194732Z tml 2022-02-03T11:09:42.010548527Z tml 2022-02-03T11:09:47.016344088Z tml 2022-02-03T11:09:52.019194397Z tml 2022-02-03T11:09:57.022509980Z tml 2022-02-03T11:10:02.028690964Z tml 2022-02-03T11:10:07.031701028Z tml 2022-02-03T11:10:12.035592381Z tml 2022-02-03T11:10:17.042442369Z tml 2022-02-03T11:10:22.044663053Z tml 2022-02-03T11:10:27.047141833Z tml 2022-02-03T11:10:32.051435050Z tml
2 查看容器中进程信息
使用:docker top 容器ID
命令,可以用这个杀进程
[root@192 ~]# docker top c2a9905be58b UID PID PPID C STIME TTY TIME CMD root 10119 10099 0 19:09 ? 00:00:00 /bin/sh -c while true;do echo tml;sleep 5;done root 10274 10119 0 19:12 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5 [root@192 ~]#
3 查看容器的元数据
彻底了解容器镜像中的元数据:docker inspect 容器ID
4 进入当前正在运行的容器
为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置,此时有两种方式:
- 进入容器后开启一个新的终端,可以在里面操作
[root@192 ~]# docker exec -it c703b5b1911f /bin/bash [root@192 ~]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@192 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 03:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done root 279 0 0 03:54 pts/0 00:00:00 /bin/bash root 315 1 0 03:56 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5 root 316 279 0 03:56 pts/0 00:00:00 ps -ef
- 进入容器正在执行的终端,不会启动新的进程
[root@192 ~]# docker attach c703b5b1911f
5 容器-宿主机拷贝命令
#拷贝容器的文件到主机中 docker cp 容器id:容器内路径 目的主机路径 #拷贝宿主机的文件到容器中 docker cp 目的主机路径 容器id:容器内路径
执行命令如下,将容器文件拷贝到宿主机
[root@192 ~]# docker exec -it c2a9905be58b /bin/bash [root@192 ~]# cd home [root@192 ~]# ls #touch 新建文件 [root@192 ~]# touch test.java [root@192 ~]# ls test.java [root@192 ~]# exit exit [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2a9905be58b centos "/bin/sh -c 'while t…" 35 minutes ago Up 35 minutes pedantic_banach [root@192 ~]# docker cp c2a9905be58b:/home/test.java /home [root@192 ~]# ls /home test.java tml-1
总结一下
以上所有的命令可以通过这样一个命令图来描述:
Docker仓库的概念有点像Maven【Jar包托管仓库】,GitHub【代码托管仓库】,是一个镜像托管仓库。本篇Blog详细学习介绍了如何下载安装Docker,以及如何进行镜像加速,了解了Docker基本的运行流程,通过基础命令、镜像命令、容器命令和日志命令等Docker常用命令贯穿了一遍Docker的使用过程,真正体会了Docker的用法。接下来通过对原理的学习来进一步加深对Docker的理解吧!