Docker从零开始到实践

Docker的由来

软件系统从开发到上线的过程,需要开发和运维之间相互协作,从操作系统、到运行环境、再到应用配置,才能保证软件在一台电脑上正常运行,这些操作都是非常繁琐的。如果换一台电脑的话,又需要重来一次。那解决这一问题,从根本上就是软件可带环境安装

  1. 虚拟机(virtual machine) 就是带环境安装的一种解决方案。它可以在一种操作系统中运行另一种操作系统。但缺点也比较明显,比如: 占用资源多,虚拟机会独占一部分的内存和硬盘资源;冗余步骤多,由于虚拟机是完整的操作系统,一些系统级别的操作步骤无法跳过;启动慢,操作系统启动需要多久,虚拟机就需要多久。

  2. 由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器
    Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。也就是说,在进程的外面套了一个保护套。容器内的应用进程直接运行于宿主的内核,容器没有自己的内核,而且也没有进行硬件虚拟。由于容器是进程级别的,相比较虚拟机有很多优势。比如:启动快(启动一个容器相当于启动本机的一个进程,而不是启动一个操作系统);资源占用少(只占用需要的资源,而且多个容器可以共享相同部分的资源,因为容器是分层的);体积小(容器只包含用到的组件)。

  3. Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序和该程序的依赖,打包成一个文件即 image。运行这个文件,就会生成一个虚拟容器。

Docker的安装

Docker 是一个开源的商业产品,有社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)这个两个版本。企业版包含了一些收费服务,个人开发者一般用不到。以下是 centos7 安装 docker 的社区版。

  • 卸载旧的 docker 版本,如果没有可忽视。
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 首次安装需要设置 Docker 仓库,安装所需的软件包:
$ 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
  • 安装最新版本的 Docker Engine-Community 和 containerd
$ sudo yum install docker-ce docker-ce-cli containerd.io
  • 启动 Docker
$ 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
  • 添加当前用户到 docker 用户组,省去 sudo
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker

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 安装常用软件

  • 安装 MySQL

从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

拉取 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

你可能感兴趣的:(Docker,docker)