什么是 Docker
Docker 是一种虚拟化容器技术,Errr…
比如以前我们要装个 Windows 系统,要先找一个系统光盘,通过电脑的 Boot 引导,一步步走安装流程,最后完成系统安装。之后系统就运行起来了,我们还要手动安装一些软件,比如微信,Chrome 浏览器等才能正常使用
而有了 Docker 之后,我们像安装软件一样安装它,之后通过 Docker Hub 镜像市场找我们感兴趣的镜像。比如我想在 Windows 上安装一个 Linux 系统下的软件,我找到这样的镜像,通过 Docker,可以秒级启动镜像,这样就能够快速使用镜像中的软件了
所以 Docker 解决了软件安装的痛点,并且运行在 Docker 容器中的镜像相互独立,一个容器挂了,不会影响到其他的容器
这个在服务器部署应用时很管用,如果采用本地安装的方式,那么当某个应用异常导致整个系统异常时(比如 Windows 上出现的蓝屏),其他的应用也无法正常提供服务,这就非常糟糕了
在 Linux CentOS 中安装 Docker
Docker 可以在 Windows,Mac,Linux 系统中安装,这里我们在 CentOS 下演示
Windows 中安装 CentOS 7
- 我们计划在 Virtual Box 虚拟机中安装 CentOS,首先下载 Virtual Box
https://www.virtualbox.org/
安装完毕,将它启动
下载 Vagrant,这是一个 Virtual Box 镜像工具
https://www.vagrantup.com/downloads.html
安装后需要重启电脑
寻找 CentOS 7 镜像
http://www.vagrantbox.es/
在这个网站里找一个 CentOS 的镜像地址,点击 Copy 进行复制

- 命令行安装
打开 Windows CMD,输入命令安装并启动镜像,下载过程需要一点时间
1 2 3 4 5 6 7 8
| # 切换到想要存放镜像的目录 $ cd d:/centos7 # 添加镜像配置 $ vagrant box add centos7 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box # 初始化镜像文件,注意这里的 centos7 必须跟上面镜像配置 vagrant box add 后的名字一致 $ vagrant init centos7 # 启动虚拟机,初次启动时会先下载镜像,消耗一定时间 $ vagrant up
|
- 连接虚拟机
镜像启动后在 Virtual Box 中可以看到启动状态
通过以下命令就可以连接到虚拟机
1 2
| $ vagrant ssh [vagrant@localhost ~]$
|
用超级管理员权限 sudo 执行命令不需要输入密码,如果出现提示要输入的话,密码是 vagrant
- 修改配置文件让虚拟机网络和主机网络互通
Notepad++ 文本编辑器打开镜像目录下的 Vagrantfile,将这一行的注释去掉,修改为
1
| config.vm.network "private_network", ip: "192.168.56.10"
|
这里 ip 修改的依据,先在 CMD 中查看所有网络的地址,并找到如下的参数
1 2 3 4 5 6 7
| $ ipconfig ... 以太网适配器 VirtualBox Host-Only Network:
连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : fe80::4bf9:1123:d5d7:4267%3 IPv4 地址 . . . . . . . . . . . . : 192.168.56.1
|
配置文件中改为同一个网段的 ip 即可
修改完毕使用如下命令重启虚拟机,并让配置生效
测试一下效果,假设主机 ip 是 192.168.70.10
从虚拟机上 ping 192.168.70.10,
从主机上 ping 192.168.56.10 (上面我们配置的 ip)
如果都是通的,表示网络配置成功,CentOS 7 我们就安装好了
- 修改系统语言为中文
在虚拟机中执行命令
1 2 3 4
| [vagrant@localhost ~]$ export LANG="zh_CN.utf8" [vagrant@localhost ~]$ sudo su - [root@localhost ~]# echo 'LANG="zh_CN.utf8"' > /etc/locale.conf [root@localhost ~]# exit
|
这样系统语言就修改为中文
CentOS 中安装 Docker 社区版
- 删除系统中的旧版本
1 2 3 4 5 6 7 8
| $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
|
- 安装 Docker
命令执行过程中出现需要选择的时候 [y/N],全部填 y 并回车
1 2 3 4 5 6 7
| $ sudo yum install -y yum-utils
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo $ sudo yum install docker-ce docker-ce-cli containerd.io
|
至此,Docker 安装完毕,参考官网
https://docs.docker.com/engine/install/centos/
- 启动 Docker
1 2 3 4 5 6
| $ sudo systemctl start docker # 查看 docker 版本 $ docker -v Docker version 19.03.8, build afacb8b # 设置 docker 开机自启动 $ sudo systemctl enable docker
|
查看一下 Docker 中当前安装的镜像(没有安装,是空的)
1 2
| $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE
|
- 配置 Docker 镜像加速
由于 Docker HUB 官网在国外,下载镜像时比较慢,我们修改为国内的阿里云
在设置前,需要登录阿里云官网注册账号,然后从其控制台进入

找到容器镜像服务


1 2 3 4 5 6 7 8
| $ sudo mkdir -p /etc/docker $ sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://替换为你自己阿里云的地址.mirror.aliyuncs.com"] } EOF $ sudo systemctl daemon-reload $ sudo systemctl restart docker
|
这样配置好以后,从 Docker HUB 中下载镜像时,就直接从国内阿里云下载,速度得到明显提高
示例,Docker 中安装 MySQL 镜像
进入 Docker HUB: https://hub.docker.com/
搜索 mysql,解读一下怎么用
像这样右上角标记了 OFFICIAL IMAGE 的,表示是官方出品

选择官方产品,进入这个页面,当我们要下载指定版本的话,找到 MySQL 的 TAGS,以及一个对应的版本,然后在命令中填写,不带版本号的命令下载的是最新版本,这里我们在虚拟机中下载 MySQL 5.7
1 2 3 4 5
| [vagrant@localhost ~]$ sudo docker pull mysql:5.7 5.7: Pulling from library/mysql ... Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
|
事实上这个镜像是一个精简版的 Linux 系统,并安装了 MySQL
在启动之前,创建几个映射目录,什么意思呢,就是可以让主机和容器的映射目录数据自动同步
1 2 3
| $ mkdir -p /mydata/mysql/log $ mkdir -p /mydata/mysql/conf $ mkdir -p /mydata/mysql/data
|
然后创建 MySQL 的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $ vi /mydata/mysql/conf/my.cnf $ cat /mydata/mysql/conf/my.cnf [client] default-character-set=utf8
[mysql] default-character-set=utf8
[mysqld] init_connect='SET collation connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve
|
现在我们将 MySQL 容器启动
1 2 3 4 5 6 7
| [vagrant@localhost ~]$ sudo docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7 897c4ea7651f7fcfe7a5ef0ccae0cdad3acbd32c364a452fec88924f86d4af4b
|
显示一串字符,就表示启动成功了,解释一下参数的含义
-p 3306:3306
命令表示将主机的 3306 端口映射到 Docker 容器中的 3306 端口
--name
是给容器命名,之后关闭,删除,启动容器都可以用上
-v
参数表示将主机路径和容器路径进行映射
-e MYSQL_ROOT_PASSWORD=root
表示将 MySQL 密码设置为 root
-d
表示后台方式启动镜像 mysql,TAG 为 5.7
可以通过 ps 命令检查当前有哪些容器启动中
1 2 3
| [vagrant@localhost ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 897c4ea7651f mysql:5.7 "docker-entrypoint.s…" 12 seconds ago Up 11 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
|
通过以下命令进入容器的交互式 shell 环境,也即进入容器的 Linux 系统 shell 中
1 2
| [vagrant@localhost ~]$ sudo docker exec -it mysql /bin/bash root@51e669295c8b:/#
|
其中 mysql 是上一步 –name 设置的容器名
为了确认 MySQL 确实启动了,使用数据库工具 navicat 进行连接测试,MySQL 的用户名和密码都是 root
主机是我们之前步骤设置的虚拟机 ip,比如本文举例的是 192.168.56.10
测试连接通过
另外,当虚拟机重启之后,Docker 不会自动启动 MySQL 容器,执行下列命令可以让它自动启动
1
| $ sudo docker update mysql --restart=always
|
提醒
如果要让 MySQL 能被局域网中的其他机器访问到,就要将虚拟机的网卡 1 设置为桥接模式,并配置上局域网的 IP
但就不能通过 Vagrant 去启动虚拟机了,因为它会根据 VagrantFile 中的配置又把虚拟机的网卡重置回去
手动配置好桥接模式,并在 Virtual Box 中启动,之后按如下方式设置一个固定 IP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 临时设置 IP $ ifconfig eth0 192.168.70.168
# 永久设置 IP $ vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=192.168.70.168 NETMASK=255.255.254.0 GATEWAY=92.168.71.255 DNS1=192.168.67.231 DNS2=192.168.4.231
# 重启网卡 $ service network restart
|
总结
使用 Docker 方式,节省了我们在环境部署上不少的时间,同时这也是目前服务端分布式非常主流的方向,通过这篇文章练手,能够将 Docker 的基本用法熟悉起来