软件系统从开发到上线的过程,需要开发和运维之间相互协作,从操作系统、到运行环境、再到应用配置,才能保证软件在一台电脑上正常运行,这些操作都是非常繁琐的。如果换一台电脑的话,又需要重来一次。那解决这一问题,从根本上就是软件可带环境安装?
虚拟机(virtual machine) 就是带环境安装的一种解决方案。它可以在一种操作系统中运行另一种操作系统。但缺点也比较明显,比如: 占用资源多,虚拟机会独占一部分的内存和硬盘资源;冗余步骤多,由于虚拟机是完整的操作系统,一些系统级别的操作步骤无法跳过;启动慢,操作系统启动需要多久,虚拟机就需要多久。
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。也就是说,在进程的外面套了一个保护套。容器内的应用进程直接运行于宿主的内核,容器没有自己的内核,而且也没有进行硬件虚拟。由于容器是进程级别的,相比较虚拟机有很多优势。比如:启动快(启动一个容器相当于启动本机的一个进程,而不是启动一个操作系统);资源占用少(只占用需要的资源,而且多个容器可以共享相同部分的资源,因为容器是分层的);体积小(容器只包含用到的组件)。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序和该程序的依赖,打包成一个文件即 image。运行这个文件,就会生成一个虚拟容器。
Docker 是一个开源的商业产品,有社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)这个两个版本。企业版包含了一些收费服务,个人开发者一般用不到。以下是 centos7 安装 docker 的社区版。
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
以下命令来设置稳定的仓库:
$ 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
$ sudo systemctl start docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jxrun896.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker
查看 docker 版本信息
docker version 或 docker --version
显示 docker 系统信息
docker info
docker 帮助命令
docker help
列出本地主机上镜像
docker images
相关参数说明:docker images -a 列出本地主机所有镜像,含中间映像层(容器是分层的)
-q:只显示镜像id
--digests:显示镜像的摘要信息
--no-trunc:不截断输出,显示完整id
从Docker Hub查找镜像
docker search [options] 镜像名称
相关参数说明:docker search -s 30 镜像名称 列出收藏数不小于指定值的镜像。
--no-trunc:显示完整的镜像描述
--automated :只列出 automated build类型的镜像
从镜像仓库中拉取
docker pull [options] 镜像名称
参数:-a 拉取所有tagged镜像
删除本地镜像
docker rmi 镜像名称id(可删除多个镜像)
参数:docker rmi -f 强制删除镜像
删除全部镜像:docker rmi -f $(docker images -qa)
创建并启动容器
docker run [options] image名称
相关参数说明:--name="容器名称":为容器指定一个name
-d:后台运行容器,并返回容器id。即启动守护式容器。
-i:以交互模式运行容器,通常与-t同时使用
-t:分配一个伪输入终端,通常与-i同时使用
-p:指定端口映射。-p hostPort:containerPort
列出当前正在运行的容器
docker ps [options]
参数-a:列出当前运行过的容器
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:显示容器id
--no-trunc:不截断输出
退出容器
两种退出方式。1、exit 容器停止退出;2、ctrl+P+Q 容器不停止退出。
启动容器
docker start 容器id或名称
重启容器
docker restart 容器id或名称
停止容器
docker stop 容器id或名称
强制停止容器 docker kill 容器id或名称
删除已停止的容器
docker rm 容器id
删除多个容器:docker rm -rf $(docker ps -aq)
查看容器日志
docker logs [options] 容器id
参数-t:显示时间戳
-f:跟踪日志输出
--tail:列出最新n条容器日志
查看容器中运行的进程信息
docker top [OPTIONS] 容器名称或id [ps OPTIONS]
获取容器/镜像的元数据
docker inspect 容器名称或id
进入正在运行的容器并以命令行交互
docker exec -it 容器名称或id /bin/bash
docker attach 容器名称或id
用于容器与主机之间的数据拷贝
docker cp 容器id:路径 主机路劲
根据拷贝的对象不同,放置的位置可以互换。
从Docker Hub 上拉去 MySQL5.7镜像
docker pull mysql:5.7
创建并启动容器
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
创建并配置 mysql 的 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 容器
docker restart mysql
拉取 Redis 最新的镜像
docker pull redis
创建目录结构
mkdir -p /mydata/redis/conf
创建配置文件
touch /mydata/redis/conf/redis.conf
创建并启动容器
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
docker exec -it redis redis-cli
修改 redis 配置文件(设置持久化)
appendonly yes
重启 redis
docker restart redis