前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker 入门

Docker 入门

作者头像
RendaZhang
发布2020-12-16 11:12:59
7160
发布2020-12-16 11:12:59
举报
文章被收录于专栏:Renda

Docker 简介

虚拟化技术

虚拟化技术是一种计算机资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来。虚拟化技术打破了计算机实体结构间的,不可切割的障碍。使用户可以比原本的组态更好的方式,来应用这些资源。

虚拟化技术主要作用:

  • 高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件。
  • 软件跨环境迁移问题。

在一台主机上实现多个操作系统,关键技术就是硬件的虚拟化。

代码语言:javascript
复制
宿主机 <----> [虚拟机,虚拟机,虚拟机]

什么是 Docker

1)合作开发的时候,在本机可以跑,别的电脑跑不起来。

这里拿 Java Web 应用程序举例,一个 Java Web 应用程序涉及很多东西,比如 JDK、Tomcat、Spring 等等。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker 则将程序直接打包成镜像,直接运行在容器中即可。

2)服务器自己的程序挂了,结果发现是别的程序出了问题把内存用完了,导致自己的程序因为内存不够就挂了。

这种也是一种比较常见的情况,如果程序重要性不是特别高的话,公司基本上不可能让程序独享一台服务器的,这时候服务器就会跟公司其他程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致程序出现问题。Docker 就很好解决了环境隔离的问题,别的程序不会影响到自己的程序。

3)公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。

在没有 Docker 的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用 Docker 的话,只需要将程序打包到镜像,要多少台服务器,就跑多少个容器,极大地提高了部署效率。

Docker 官网地址https://www.Docker.com

官方给 Docker 的定位是一个应用容器平台。

Docker 是一个开源的应用容器引擎,诞生于 2013 年初,基于 Go 语言实现,dotCloud 公司出品(后改名为 Docker Inc)。

Docker 容器是完全使用沙箱机制,相互隔离,性能开销也极低。

从 17.03 版本之后,Docker 分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。

Docker 通俗的讲是服务器中高性能的虚拟机,可以将一台物理机虚拟 N 多台虚拟机的机器,互相之间隔离,互不影响。

Build, Ship and Run - 搭建、发送、运行。

Build once, Run anywhere - 搭建一次,到处能用。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

特点:

  • 标准化交付:Docker 将应用打包成标准化单元,用于交付、部署;
  • 轻量级:容器及包含了软件运行所需的所有环境,而且非常轻量级;
  • 高可靠:容器化的应用程序,可以在任何 Linux 环境中始终如一的运行。
  • 隔离性:容器化的应用程序,具备隔离性,这样多团队可以共享同一 Linux 系统资源。

容器与虚拟机比较

Docker 是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机方式则是在硬件层面实现。

  • 容器 - 启动秒级,硬盘使用一般为 MB,性能接近原生硬件,单机可跑几十个容器,运行环境主要在 Linux。
  • 虚拟机 - 启动分钟级,硬盘使用一般为 GB,性能弱,单机可跑单机几个虚拟 OS,运行环境主要在 Window。

相同:容器和虚拟机都是虚拟化技术,具备资源隔离和分配优势。

不同:

  • Docker 虚拟化的是操作系统,虚拟机虚拟化的是硬件。
  • 传统虚拟机可以运行不同的操作系统,Docker 主要运行同一类操作系统 (Linux)。

虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker 是不携带操作系统的,所以 Docker 的应用就非常的轻巧。

Docker 基本概念

宿主机:安装 Docker 守护进程的 Linux 服务器,称之为宿主机。

镜像 Image:Docker 镜像,就相当于是一个 root 文件系统。包含了容器运行所需要的程序、资源、配置等信息。如果想在 Docker 中运行一个 MySQL 容器,首先需要先从镜像仓库下载一个 MySQL 的镜像到本地。

说白了,这个 Docker 镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

容器 Container:镜像运行之后的实体,镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

镜像和容器的关系类似于 Java 中类和对象的关系:

  • 镜像安装运行之后就是容器。
  • 容器可以持久化为镜像。
  • 镜像 - 安装、删除、拉取。
  • 容器 - 启动、关闭、删除、暂停。

仓库 Registry:仓库可看成一个镜像控制管理中心,用来保存镜像。用户可以从仓库拉取镜像。

负责对 Docker 镜像进行管理的,是 Docker Registry 服务。

Docker Registry 服务对镜像的管理是非常严格的,最常使用的 Registry 公开服务,是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

Docker 安装与启动

如果是 Windows 操作系统的电脑需要安装虚拟机,虚拟机搭配 Linux 操作系统,在 Linux 操作系统上安装 Docker 容器。

Docker 需要从镜像仓库下载镜像,需要联网。

准备工作:确保 Linux 系统能够连接网络。Linux 版本为 CentOS7。

这里我配置 Linux CentOS 7 虚拟机 IP 地址 为 192.168.186.140

安装

1)查看电脑上已经已经安装 Docker

代码语言:javascript
复制
yum list installed | grep docker

2)安装 docker

代码语言:javascript
复制
yum -y install docker

3)安装后查看 docker 版本

代码语言:javascript
复制
[root@localhost ~]# docker -v
Docker version 18.06.1-ce, build e68fc7a

Docker 守护进程相关命令

systemctl 命令是系统服务管理器指令。

启动 docker:

代码语言:javascript
复制
systemctl start docker

停止 docker:

代码语言:javascript
复制
systemctl stop docker

重启 docker:

代码语言:javascript
复制
systemctl restart docker

查看 docker 状态:

代码语言:javascript
复制
systemctl status docker

开机启动:

代码语言:javascript
复制
systemctl enable docker

查看 docker 概要信息:

代码语言:javascript
复制
docker info

查看 docker 帮助文档

代码语言:javascript
复制
docker --help

镜像加速的 2 个方案

默认情况,将从 docker hub (https://hub.docker.com/) 下载 docker 镜像太慢,一般都会配置镜像加速器。

方案一:中科大

中国科学技术大学 (ustc) 是老牌的 linux 镜像服务提供者了,还在遥远的 ubuntu 5.04 版本的时候就在用。USTC 的 docker 镜像加速器速度很快。USTC docker mirror 的优势之一就是不需要注册,是真正的公共服务。

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

编辑该文件:

代码语言:javascript
复制
vi /etc/docker/daemon.json

在该文件中输入如下内容:

代码语言:javascript
复制
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
方案二:阿里云

如果中科大镜像加载速度很慢,建议配置阿里云镜像加速,这个镜像仓库如果不好使,可以自己从阿里云上申请。注册后每个人分配一个免费的 docker 镜像加速地址,速度极快。

代码语言:javascript
复制
{
    "registry-mirrors": ["https://3ad96kxd.mirror.aliyuncs.com"]
}

配置完成记得刷新配置。

代码语言:javascript
复制
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker 常用命令

代码语言:javascript
复制
DockerClient --https/http--> DockerHost

DockerHost --https/http--> DockerRegistry

DockerHost: 
[
  docker daemon,
  container,
  image
]

DockerReistry:
[
  Docker hub 
  {
    repository1(image1, image2, image3, image4),
    repository2(image1, image2, image3, image4)
  }
]

镜像相关命令

查看镜像

查看本地所有镜像:

代码语言:javascript
复制
[root@localhost ~]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
centos/mysql-57-centos7   latest              2e4ddfafaa6f        2 years ago         445MB
centos                    7                   5182e96772bf        2 years ago         200MB
redis                     latest              4e8db158f18d        2 years ago         83.4MB
tomcat                    7-jre7              fa2c33156fb9        2 years ago         357MB
nginx                     latest              c82521676580        2 years ago         109MB
registry                  latest              b2b03e9146e1        2 years ago         33.3MB

这些镜像都是存储在 Docker 宿主机的 /var/lib/docker 目录下。

搜索镜像

如果需要从网络中查找需要的镜像,可以通过以下命令搜索(注意,必须确保当前系统能联网):

代码语言:javascript
复制
docker search 镜像名称
拉取镜像

拉取镜像:从 Docker 仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去 docker hub 搜索对应镜像查看。

代码语言:javascript
复制
docker pull 镜像名称

例如,要下载 centos7 镜像:

代码语言:javascript
复制
docker pull centos:7
删除镜像

按镜像 ID 删除镜像:

代码语言:javascript
复制
docker rmi 镜像ID

删除所有镜像:删除之前要确认此镜像已经没有被容器在使用,如果存在正在运行的 docker 容器,删除会报错 “Error: container_delete: Impossible to remove a running container, please stop it first”

代码语言:javascript
复制
# 查看所有镜像的 ID
docker images -q
# 批量删除镜像
docker rmi `docker images -q`

容器相关命令

查看容器

查看正在运行的容器:

代码语言:javascript
复制
docker ps

查看所有容器(查看正在运行的和已经停止运行的):

代码语言:javascript
复制
docker ps –a
docker ps -all

查看最后一次运行的容器:

代码语言:javascript
复制
docker ps –l

查看停止的容器:

代码语言:javascript
复制
docker ps -f status=exited
创建与启动容器

创建容器命令:

代码语言:javascript
复制
docker run 参数 镜像名称:镜像标签 /bin/bash

创建容器常用的参数说明:

代码语言:javascript
复制
## 命令参数详解

-i:表示运行容器,如果不加该参数那么只是通过镜像创建容器,而不启动。

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果只加 it 两个参数,创建后就会自动进去容器)。

-d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录)。

--name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射,例如:可以将 Docker 中 Tomcat 容器的 8080 端口映射到宿主机上的某一个端口 8080,那么以后访问 tomcat 只需要 - http://宿主机的IP:8080/

/bin/bash: 进入容器之后,初始化执行的命令,可写可不写。
1)交互式容器

使用交互式运行容器,容器运行后直接进入到容器内部,退出容器内部后,容器直接关闭。

代码语言:javascript
复制
docker run -it --name=容器名称 镜像名称:标签 /bin/bash

这时通过 ps 命令查看,发现可以看到启动的容器,状态为启动状态。

退出当前容器:

代码语言:javascript
复制
exit
2)守护式容器
代码语言:javascript
复制
docker run -di --name=容器名称 镜像名称(或镜像ID):标签 /bin/bash
3)登录容器 / 进入容器的目录
代码语言:javascript
复制
docker exec -it 容器名称 (或者容器ID)  /bin/bash

注意:这里的登陆容器之后执行的脚本 /bin/bash 必须写。

停止与启动容器

停止容器:

代码语言:javascript
复制
docker stop 容器名称(或者容器ID)

启动容器:

代码语言:javascript
复制
docker start 容器名称(或者容器ID)
文件拷贝

如果需要将宿主机的文件拷贝到容器内可以使用 cp 命令:

代码语言:javascript
复制
docker cp 需要拷贝的文件或目录 容器名称:容器目录

# 新建一个空文件
touch renda.html
# 拷贝到 tomcat 容器的 webapps 目录下
docker cp renda.html 59b35c0bbe6d:/usr/local/tomcat/webapps
# 切换到 tomcat 容器中查看
docker exec -it tomcat容器ID /bin/bash

也可以将文件从容器内拷贝出来:

代码语言:javascript
复制
docker cp 容器名称:容器目录 需要拷贝的文件或目录

# 将 copy 到 tomcat 容器的文件再 copy 出来
docker cp 59b35c0bbe6d:/usr/local/tomcat/webapps/renda.html ./
目录挂载

可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器添加 -v 参数,后边为宿主机目录 : 容器目录,例如:

代码语言:javascript
复制
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
查看容器 IP 地址

可以通过以下命令查看容器运行的各种数据:

代码语言:javascript
复制
docker inspect 容器名称(容器ID)

也可以直接执行下面的命令直接输出 IP 地址:

代码语言:javascript
复制
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
删除容器

删除指定的容器,正在运行的容器无法删除:

代码语言:javascript
复制
# 删除容器
docker rm 容器名称(容器ID)

# 删除镜像
docker rmi 镜像ID(镜像名称)

Docker 数据卷 - Volumes

数据卷概述

数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。

一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

简单来说数据卷本质其实是共享文件夹,是宿主机与容器间数据共享的桥梁。

数据卷作用:

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换

数据卷配置方式

1)1 个容器挂载 1 个数据卷
代码语言:javascript
复制
docker run ... –v 宿主机目录(文件):容器内目录(文件) ... 

注意事项:

  1. 目录必须是绝对路径
  2. 如果宿主机目录不存在,会自动创建
  3. 可以挂载多个数据卷

案例:

代码语言:javascript
复制
# 拉取 centos 镜像
docker pull centos:7

# 安装启动容器并挂载
docker run -di --name=c_centos -v /root/host_data1:/root/c1_data centos:7 /bin/bash
2)查看容器已挂载的数据卷

可以通过以下命令,查看容器中挂载的数据卷:

代码语言:javascript
复制
docker inspect 容器名称(容器ID)
3)1 个容器挂载多个数据卷

可以通过以下命令,挂载多个数据卷:

代码语言:javascript
复制
docker run -di --name=c1 -v /root/host_data1:/root/c1_data1 -v /root/host_data2:/root/c1_data2 centos:7 /bin/bash
4)多个容器挂载 1 个数据卷

多个容器挂载 1 个数据卷,实现数据共享:

代码语言:javascript
复制
docker run -di --name=c2 -v /root/host_data_common:/root/c2_data centos:7
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7

多个容器挂载 1 个容器(这个容器挂载 1 个数据卷):

代码语言:javascript
复制
## 创建启动 c3 数据卷容器,使用 –v 参数 设置数据卷
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7 /bin/bash

## 创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
docker run -di --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -di --name=c2 --volumes-from c3 centos:7 /bin/bash

在 Docker 中部署软件

MySQL 部署

1) 搜索 mysql 镜像
代码语言:javascript
复制
docker search mysql
2) 拉取 mysql 镜像
代码语言:javascript
复制
docker pull mysql:5.7
3) 创建容器,设置端口映射、目录映射
代码语言:javascript
复制
docker run -di --name=mysql -p 3307:3306 -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

参数说明:

  • -p 3307:3306 - 将容器的 3306 端口映射到宿主机的 3307 端口。
  • -v /root/mysql/logs:/logs - 将主机目录 (/root/mysql) 下的 logs 目录挂载到容器中的 logs;日志目录。
  • -v /root/mysql/data:/var/lib/mysql:将宿主机目录 (/root/mysql) 下的 data 目录挂载到容器的 /var/lib/mysql;数据目录。
  • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
4) 进入容器,操作 mysql
代码语言:javascript
复制
docker exec –it mysql /bin/bash
5)使用 Navicat 远程连接容器中的 mysql

因为做了端口映射,所以连接的是192.168.186.140:3307

Tomcat 部署

1) 搜索 tomcat 镜像
代码语言:javascript
复制
docker search tomcat
2) 拉取 tomcat 镜像
代码语言:javascript
复制
docker pull tomcat:8-jdk8
3) 创建容器,设置端口映射、目录映射
代码语言:javascript
复制
docker run -di --name=tomcat -p 8080:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8-jdk8

参数说明:

  • -p 8080:8080:将容器的 8080 端口映射到主机的 8080 端口。
  • -v /root/tomcat/webapps:/usr/local/tomcat/webapps:将主机目录 (/root/tomcat/webapps) 挂载到容器的 webapps。
4) 向 Tomcat 中部署服务,使用 FinalShell 文件上传
5) 使用外部机器访问 Tomcat,测试部署服务

Nginx 部署

1) 搜索 Nginx 镜像
代码语言:javascript
复制
docker search Nginx
2) 拉取 Nginx 镜像
代码语言:javascript
复制
docker run -di --name=mynginx -p 80:80 nginx

测试访问:http://192.168.186.140:80

Redis 部署

1) 搜索 Redis 镜像
代码语言:javascript
复制
docker search redis
2) 拉取 redis 镜像
代码语言:javascript
复制
docker pull redis
3) 创建容器,设置端口映射
代码语言:javascript
复制
docker run -id --name=redis -p 6379:6379 redis
4) 使用外部机器连接 redis 测试

迁移与备份

应用场景:

开发环境 Docker,在 Docker 中安装很多的容器,进行对应的配置,将 Docker 中的运行的容器持久化为镜像,将对应的镜像安装到生产环境中。

  1. 将开发环境下的 Docker 中对应的容器持久化为镜像。
  2. 将镜像保存为一个压缩包,发送到生产环境服务器中。
  3. 生产环境中需要将压缩包 --> 镜像 --> 容器。

容器保存为镜像

可以通过以下命令将容器保存为镜像:

代码语言:javascript
复制
docker commit {正在运行容器名称/容器ID} {ImageName} : {Tag}

# 例如
docker commit 288d7f874dff redis:version_renda_1.0.0

镜像标签 tag 如果不写默认为 latest

镜像备份

可以通过以下命令将镜像保存为 tar 文件:

代码语言:javascript
复制
docker save -o {压缩包存放路径} {镜像名称/镜像ID}

# 举例
# 压缩包在生产环境下会还原为一个 image,还原之后的 name 和 tag
# -o :输出到的文件
docker save -o redis.tar redis:version_renda_1.0.0

镜像恢复与迁移

首先先删除掉备份的镜像,然后执行此命令进行恢复:

代码语言:javascript
复制
docker load -i {备份的镜像文件}

# 举例
# -i :指定导入的文件
docker load -i redis.tar

执行后再次查看镜像,可以看到镜像已经恢复,可以再次运行测试:

代码语言:javascript
复制
docker run -di --name=mytomcat -p 8081:8080 -v /root/tomcat/webapps/:/usr/local/tomcat/webapps redis:version_redis_1.0.0
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Renda 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker 简介
    • 虚拟化技术
      • 什么是 Docker
        • 容器与虚拟机比较
          • Docker 基本概念
          • Docker 安装与启动
            • 安装
              • Docker 守护进程相关命令
                • 镜像加速的 2 个方案
                  • 方案一:中科大
                  • 方案二:阿里云
              • Docker 常用命令
                • 镜像相关命令
                  • 查看镜像
                  • 搜索镜像
                  • 拉取镜像
                  • 删除镜像
                • 容器相关命令
                  • 查看容器
                  • 创建与启动容器
                  • 停止与启动容器
                  • 文件拷贝
                  • 目录挂载
                  • 查看容器 IP 地址
                  • 删除容器
              • Docker 数据卷 - Volumes
                • 数据卷概述
                  • 数据卷配置方式
                    • 1)1 个容器挂载 1 个数据卷
                    • 2)查看容器已挂载的数据卷
                    • 3)1 个容器挂载多个数据卷
                    • 4)多个容器挂载 1 个数据卷
                • 在 Docker 中部署软件
                  • MySQL 部署
                    • 1) 搜索 mysql 镜像
                    • 2) 拉取 mysql 镜像
                    • 3) 创建容器,设置端口映射、目录映射
                    • 4) 进入容器,操作 mysql
                    • 5)使用 Navicat 远程连接容器中的 mysql
                  • Tomcat 部署
                    • 1) 搜索 tomcat 镜像
                    • 2) 拉取 tomcat 镜像
                    • 3) 创建容器,设置端口映射、目录映射
                    • 4) 向 Tomcat 中部署服务,使用 FinalShell 文件上传
                    • 5) 使用外部机器访问 Tomcat,测试部署服务
                  • Nginx 部署
                    • 1) 搜索 Nginx 镜像
                    • 2) 拉取 Nginx 镜像
                  • Redis 部署
                    • 1) 搜索 Redis 镜像
                    • 2) 拉取 redis 镜像
                    • 3) 创建容器,设置端口映射
                    • 4) 使用外部机器连接 redis 测试
                • 迁移与备份
                  • 容器保存为镜像
                    • 镜像备份
                      • 镜像恢复与迁移
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档