Docker是基于Go语言开发的开源应用容器引擎,遵从Apache Licence2.0协议,可以让开发者打包应用以及应用的依赖包到一个可移植的容器中,然后发布到各种发行版本的Linux系统上。
软件开发中最为麻烦的事情可能就是配置环境了。由于用户使用的操作系统具有多样性,即便使用跨平台的开发语言(如Java和Python)都不能保证代码能够在各种平台下都可以正常的运转,而且在不同的环境下我们安装的软件需要依赖的软件包也是不一样的。
那么问题来了,我们安装软件的时候可不可以把软件运行的环境一并安装?我们是不是可以把原始环境一模一样地复制过来呢?
虚拟机(virtual machine)就是带环境安装的一种解决方案,它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统,在macOS上运行Windows,而应用程序对此毫无感知。使用过虚拟机的人都知道,虚拟机用起来跟真实系统一模一样,而对于虚拟机的宿主系统来说,虚拟机就是一个普通文件,不需要了就删掉,对宿主系统或者其他的程序并没有影响。但是虚拟机通常会占用较多的系统资源,启动和关闭也非常的缓慢,总之用户体验并没有想象中的那么好。
Docker属于对Linux容器技术(LXC)的一种封装(利用了Linux的namespace和cgroup技术),它提供了简单易用的容器使用接口,是目前最流行的Linux容器解决方案。Docker将应用程序与该程序的依赖打包在一个文件里面,运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。下图是虚拟机和容器的对比,左边是传统的虚拟机,右边是Docker。
目前,Docker主要用于几下几个方面:
1.确定操作系统内核版本(CentOS7要求64位,内核版本3.10+;CentOS6要求64位,内核版本2.6+),可以通过下面的命令确定Linux系统内核版本并更新底层库文件。
uname -r
yum update
2.在CentOS下使用yum安装Docker并启动
yum search docker
yum -y install docker
systemctl start docker
3.查看Docker的信息和版本
docker version
docker info
4.查看端口情况,停止一些占用端口的服务
netstat -ntlp
systemctl stop nginx
systemctl stop mysqld
5.安装Docker后,由于直接访问dockerhub下载镜像会非常缓慢,建议服务器更换为国内镜像,可以通过修改/etc/docker/daemon.json
文件来做到。一般的云服务器会有自己专属的镜像,就不需要手动修改了。
{
"registry-mirrors":[
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
6.分别下载nginx、mysql、redis镜像
docker search nginx # OFFICIAL为ok的是官方镜像
docker pull nginx:latest # 下载最新版镜像
docker pull mysql:5.7.29
docker pull redis:latest
7.查看、删除镜像等常用操作
docker images # 查看镜像
docker rmi 1319b1eaa0b7 # 删除镜像 最后面为镜像id
docker run -d -p 80:80 -v /root/html:/usr/share/nginx/html --name --rm mynginx nginx:latest # 运行容器
#-p 系统端口:容器内部端口
#--rm 停止即删除容器
#-v 将系统/root/html目录挂载到容器目录/usr/share/nginx/html下
docker ps # 查看运行的容器
docker stop/start/restart mynginx # 停止/启用/重启mynginx的容器
docker ps -a # 查看所有容器
docker rm -f mynginx # 加上-f为强制删除运行中的mynginx容器
docker exec -it mynginx /bin/bash # 进入容器shell环境,exit可退出
docker run -d -p 6379:1234 --name redis-master redis:latest redis-server --requirepass root1234 --port 1234 --appendonly yes
#--requirepass 密码
#--port 容器内部为1234端口
#--appendonly 数据持久化 yes
docker ps
命令解释
ps # 查看当前运行的进程
ps -ef # 查看所有进程
ps -ef | grep 关键词 # 搜索进程
接下来我们试一试运行多个容器并让多个容器之间通过网络通信。我们创建4个Redis容器来实现一主三从的主从复制结构。
docker run -d -p 6379:6379 --name redis-master redis redis-server --requirepass xxxx
docker run -d -p 6380:6379 --link redis-master:redis-master --name redis-slave-1 redis:latest redis-server --slaveof redis-master 6379 --masterauth xxxx
docker run -d -p 6381:6379 --link redis-master:redis-master --name redis-slave-2 redis:latest redis-server --slaveof redis-master 6379 --masterauth xxxx
docker run -d -p 6382:6379 --link redis-master:redis-master --name redis-slave-3 redis:latest redis-server --slaveof redis-master 6379 --masterauth xxxx
上面的命令中,--link
参数用于给容器创建网络别名,因为三台从机(slave)需要通过网络连接自己的主机(master)。虽然,我们可以通过命令docker inspect --format '{ { .NetworkSettings.IPAddress }}'
来查看到容器的IP地址,但是由于容器的即装即用性,容器的IP地址有可能会发生变化,如果直接使用IP地址,在容器重启后就可能会因为IP地址的变化导致从机无法连接到主机。使用--link
参数创建网络别名就是为了在启动Redis服务器时在redis-server
后面的--replicaof
参数后使用这个别名而不是IP地址。
查看redis-mater一主带三从的配置是否成功
docker exec -it redis-master /bin/bash
# 下面是容器内部操纵
redis-cli # 进入redis
auth xxxx
info replication # 查看redis状态信息
quit
exit
docker exec -it redis-slave-1 /bin/bash
redis-cli # 进入redis
info replication # 查看redis状态信息
quit
exit
建立存储mysql数据的文件夹:
mkdir -p docker/mysql/{
conf,data} # 一次性建两个文件夹
创建并运行mysql容器
docker run -d -p 3306:3306 --name mysql57 -v /root/docker/mysql/conf:/etc/mysql/mysql.conf.d -v /root/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxxx mysql:5.7
上面的两个数据卷操作一个是映射了MySQL配置文件所在的文件夹,一个是映射了MySQL数据所在的文件夹,这两个数据卷操作非常重要。我们可以将MySQL的配置文件放在$PWD/mysql/conf
目录下,配置文件的具体内容如下所示:
[mysq1d]
pid-file=/var/run/mysq1d/mysqld.pid #
socket=/var/run/mysqld/mysqld.sock #
datadir=/var/1ib/mysq1 #
1og-error=/var/1og/mysq1/error.1og #
server-id=1 #
1og-bin=/var/1og/mysq1/mysql-bin.1og #
expire_logs_days=30 #
max_binlog_size=256M #
symbolic-links=0 #
GitLab是由GitLabInc.开发的Git仓库管理工具,具有wiki、问题跟踪、持续集成等一系列的功能,分为社区版和企业版。通过Docker提供的虚拟化容器,我们可以安装社区版的Docker。因为GitLab需要使用SSH协议进行安全连接,我们要暴露容器的22端口,所以可以先将宿主机SSH连接的22端口修改为其他端口(如:12345),然后再进行后续的操作。
vim /etc/ssh/sshd_config
将其中定义端口的那行代码去掉注释并将端口修改为19191
Port 19191
重新启动sshd
服务
systemctl restart sshd
提示:修改端口后应该确保防火墙上也开启对应的端口,否则无法使用SSH连接到Linux服务器。
创建需要用于数据库映射操作的文件夹。
mkdir -p /root/gitlab/{
config,logs.data}
基于gitlab/gitlab-ce 镜像创建容器,并暴露80端口(HTTP连接)和22端口(SSH连接)。
docker run -d -p 80:80 -p 22:22 --name gitlab -v /root/gitlab/config:/etc/gitlab/ -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
|说明:GitLab的启动比较缓慢,创建好容器后可能需要等待一段时间才能通过浏览器来进行访问。
首次进入GitLab访问界面会提示我们修改管理员密码,设置好管理员密码后就可以在登录界面输入用户名root和刚才设置的密码登录到管理员控制台,在使用上还是非常简单和人性化的。
查看容器ID
docker container ls -a
提交定制的容器
docker commit xxxxxIDxxxx winston/mysql
查看镜像文件
docker images
生成镜像文件以后,后面就可以利用刚才创建的镜像文件来创建新的容器
打包镜像文件
docker save winston/mysql -o winston.tar
在其它的主机上加载镜像文件
docker load winston.tar
想把镜像上传到docker官网供其他人使用
docker login
docker push wintson/mysql
Dockerfile使用DSL(Domain Specific Language)来构建一个Docker镜像,只要编辑好了Dockerfile文件,就可以使用docker build
命令来构建一个新的镜像。
可参考:Dockerfile命令详解
可参考:Docker Compose 模板文件
可参考:Kubernetes容器集群管理环境