从实战开始,零基础Docker入门教程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从实战开始,零基础Docker入门教程相关的知识,希望对你有一定的参考价值。

前提

本文是基于windows环境下使用docker的学习文章

其实我也有很长的一段时期在ubuntu系统下开发,很喜欢linux系统的纯净方便,但是当你身边同事都是使用windows与你交流沟通传输资料的时候,使用linux系统开发倒是一件不方便的事情,再加上领导曾说了一句你用windows吧别和同事们不一样,然后我就一直使用windows了,不过也一直想着回到linux系统的怀抱下,双系统虚拟机都试过,直到遇到了Docker我才意识到这不就是我一直寻找的windows和linux完美共存的方案么!

Docker的官方概念就不说了,相关的资料很多,如果不了解那就先去网上了解一下吧,这次我将从个人使用的角度去入门Docker,初步做到会用,而不去长篇大论讲概念

Docker能干什么?

张三是个程序员,平时开发需要安装各种软件,这次开发的项目需要Redis,没有Docker之前张三需要先去官网下载Redis,然后发现官网没有window版本,再几经搜索在github找到了redis for windows,然后又因为github网络的问题,缓慢下载下下来,再解压到某个目录,然后执行启动服务命令.有了Docker之后,直接执行一条docker run命令,即可成功,另外开发中还会需要安装不同版本的mysql,如果直接装到本机上,首先多个mysql都可能要在系统中注册服务,配置和环境要隔离出来,卸载的时候也比较麻烦,,如果使用docker直接根据版本拉取镜像,绑定端口运行即可,不需要的时候直接删掉容器即可

李四也是程序员,平时需要在linux系统下做一些编译或者测试,但是因为公司的原因要装各种window独占的通讯软件,外加李四偶尔还想玩个CS:GO,所以他想在window和linux之间无缝切换,最一开始李四想到的是买两台笔电,这种想法想想就行了,后来又想到装双系统,双系统切换在于要重启太不方便,又想到装vmware虚拟机,vmware其实差不多可以满足李四的想法了,但是vmware太占内存了,最终李四选择了在window上使用Docker,需要linux的时候直接run一个linux系统的镜像即可,linux系统手到擒来,轻量快速都是vmware不可比的

王五还是一个程序员,不过他的工作稍多一些,平时需要部署项目在测试服务器上,没有docker之前,王五先打包然后手动复制到服务器上,然后进入对应目录,执行命令启动项目,有了docker之后,王五打包项目的时候程序就会将镜像推动到仓库中,然后通过可视化界面或服务器命令重新拉取重启项目即可,并且出现问题之后可以通过tag快速回退启动上一个版本,后来王五又偷懒了,在上边的基础集成了自动化,直接提交代码,服务器自动构建部署运行

林六又是一个程序员,他搭建了一套比较复杂的程序,程序依赖很多服务,同时还有很多配置,每次给别人演示安装的时候他都需要忙活半天去搭建环境,最后还不一定能成功,这样时候他总挠挠头说,在我机子上真能运行,有了docker之后,他把一系列程序通过打成一个docker镜像,在给别人演示的时候,只要先安装上docker,然后拉取他的镜像就可以了

以上都是docker在个人开发上提高效率的案例,我认为学习docker最好就是把docker应用到实际开发生活中来,这样才能更快更好的理解Docker,下面就基于windows环境开始学习如何使用Docker

安装Docker

系统准备

电脑性能别太差了不然毫无体验,检查windows版本是否为企业版或专业版,并开启Hyper-v

程序下载

Windows 10以上,去官网下载​​Docker Desktop​​,,目前Docker Desktop的体验非常好,Windows 10以下建议升级win10

从实战开始,零基础Docker入门教程_Docker

注册docker hub的账号(仅作登录Docker Desktop使用),安装完成后需要登录Docker,在CMD中运行docker -v 出现版本号即为成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cm8rrMQN-1591522751185)(C:\\Users\\caokang\\AppData\\Roaming\\Typora\\typora-user-images\\image-20200603152711962.png)]

切换容器类型

下载完成后需要切换成Linux容器类型,右键docker托盘图标,选择Switch to Linux containers,因为我已经转换过了,所以这里是Switch to Windows containers

从实战开始,零基础Docker入门教程_Docker_02

镜像源修改

我是用的是阿里云的镜像源,需要去阿里云注册账号,然后在镜像加速中查看你的加速器地址

从实战开始,零基础Docker入门教程_Docker_03

从实战开始,零基础Docker入门教程_Docker_04

修改源地址,右键docker托盘图标->setting->然后按照如图修改加速源,最后点击 apply&restart 即可

从实战开始,零基础Docker入门教程_Docker_05

开始Docker

基本概念

镜像(Image):一个文件,里面存放着程序以及运行方式

容器(Container):镜像运行的实体

仓库(Repository):镜像仓库

标签(Tag):标识着镜像的版本

搜索镜像

镜像的查找可通过docker search命令,请在window的cmd窗口或powershell中,不建议在git bash中使用,因为在git bash中会有错误提示

C:\\Users\\xxxx>docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8245 [OK]
bitnami/redis Bitnami Redis Docker Image 147 [OK]
sameersbn/redis 80 [OK]
grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0 68
......

然后可以根据DESCRIPTION通过NAME选择镜像,推荐下载第一个,一般都是官方源
关于镜像的下载: 启动一个镜像的时候,如果镜像不存在,则会先进行pull(下载)操作,你也可以主动pull,这样docker会把镜像下载本机,启动的时候则无需再次下载

docker pull redis

安装Redis

docker run -d --name redis -p 6379:6379 redis

run 创建一个新的容器并运行一个命令
-d 后台运行容器,并返回容器ID,如果不加这个,程序将以前台启动,一旦关闭程序也将自动关闭
--name 给容器指定一个名称,建议加,方便以后维护
-p 使用方法: [-p 宿主机端口:容器内端口] 说明: 指定端口映射,因为默认情况下容器的网络与宿主机不互通,通过该参数可把redis的6379端口映射到本机6379端口上

安装两个Mysql

mysql5.6
C:\\Users\\xxxxx>docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9587 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3486 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 702 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 76
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 69
centurylink/mysql Image containing mysql. Optimized to be link… 61 [OK]

比如我们想安装mysql5.6的版本,通过search我们也无法得知mysql的具体版本,,最简单的方法就是去官方hub上查阅,访问​​https://hub.docker.com/_/mysql?tab=tags​​,,(也可以使用命令的方式去查找版本号,不过这个需要安装脚本,以后再说)

从实战开始,零基础Docker入门教程_Docker_06

从实战开始,零基础Docker入门教程_Docker_07

这里先下载mysql5.6的镜像

docker pull mysql:5.6

5.6 , 5.7就是镜像的tag,tag可以理解为镜像的名字,如果不加tag,则会下载tag为latest的镜像

通过镜像的Description,得知我们需要指定MYSQL_ROOT_PASSWORD才能运行mysql5.6

从实战开始,零基础Docker入门教程_Docker_08

docker run -d --name mysql56 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306  mysql:5.6

-e 设置环境变量,至于都有什么环境变量供我们去设置,可以通过查阅hub官网的Description标签页可以得知

mysql5.7

因为安装mysql5.6已经讲宿主机的3306端口分配了,所以需要指定一个新的端口

docker pull mysql:5.7
docker run -d --name mysql57 -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 mysql:5.7

从实战开始,零基础Docker入门教程_Docker_09

卸载mysql5.6

可视化操作的话,右键docker托盘图标->Dashboard

从实战开始,零基础Docker入门教程_Docker_10

命令操作

docker stop mysql56
docker rm mysql56

stop 停止一个运行中的容器

rm 删除一个停止的容器

docker rm -f mysql57

-f 默认情况下 rm 无法删除正在运行的容器,加 -f 即可强制删除

后面追加容器id或容器name,因为上面我们通过--name指定了容器名称,所以这里直接输入即可,这也是我为什么建议加--name参数指定容器名称的原因,

如果我们忘记了容器名称呢?

查询docker容器
C:\\Users\\xxxxx>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a7215cb11e2 redis "docker-entrypoint.s…" 6 hours ago Up 6 hours 0.0.0.0:6379->6379/tcp redis

docker ps 查询运行中的容器
docker ps -a 查询所有容器

第一列的5a7215cb11e2就是容器id(CONTAINER ID),我们也就可以使用容器id进行对容器的操作

创建两个数据,再删除两个数据库,对本机的系统没有造成任何污染,这就是Docker的优点,简直就是渣男,一旦分手忘得干干净净的

删除镜像

刚刚删除了mysql的容器,一旦再次需要mysql服务,直接run无需下载即可立马启动mysql服务,这是因为mysql的镜像依然在我们本机存储着,简直就是渣男,分手了还把对方藏在心底,这次我们要和mysql彻底决裂,那就是删除镜像

docker rmi mysql:5.6 
docekr image rm mysql:5.6
#以上两条命令操作相同,rmi 是 image rm 简化版

查询本机镜像

docker image ls
docker images
#以上两条命令操作相同,images 是 image ls 简化版

安装linux系统

以安装centos为例

docker search centos
docker pull centos
docker run -d -it --name centos -v /d/dev/test:/home/test centos
文件挂载

先解释 -v /d/dev/test:/home/test ,表示将宿主机的D:/dev/test目录与容器内部的/home/test目录映射起来,在该目录下的操作的双向影响的

在这里D:/dev/test要写成/d/dev/test的形式

从实战开始,零基础Docker入门教程_Docker_11

伪终端启动

接下来说 -it 是干嘛的

-i:以交互模式运行容器,通常与 -t 同时使用

-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;

直接说效果吧,因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了,所以结合-d -it 就是后台启动centos 并保持一个伪终端防止centos自动关闭,也可以使用-itd

进入容器

容器已经后台启动了 ,如何进入容器?

docker exec -it centos /bin/bash

exec 在运行的容器中执行命令

-it 执行一个交互的终端

/bin/bash 选择执行的bash

exec并不是一个进入容器的命令,而是一个在运行的容器中执行命令的命令,-it标识启动了一个交互的终端,bash使用/bin/bash,所以上述命令是给了我们一个和容器内部通信的终端

更详细的区别请看 ​docker run 和 docker exec 的差异

文件交互

即使没有挂载了文件目录,我们还是可以通过命令用来复制传输容器文件

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

将主机/d/dev/test2目录拷贝到容器centos的/home目录下。
docker cp D:/dev/test2/ centos:/home/

将容器centos的/home/test3目录拷贝到主机的D:/dev/目录中。
docker cp centos:/home/test3 D:/dev/

在这里D:/dev/test形式不要变

图形化桌面

​https://www.jianshu.com/p/38a60776b28a​

安装wordpress+mysql

接下来需要做的是安装两个容器wordpress和mysql,并让wordpress连接mysql数据库

分别安装

首先安装mysql

docker run -d  -e  MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7

然后安装wordpress

docker run -d -p 80:80 --link mysql57:mysql -e WORDPRESS_DB_PASSWORD=root --name wordpress wordpress

分别执行以上两条命令,然后访问localhost:80即可打开wordpress安装界面

从实战开始,零基础Docker入门教程_Docker_12

首先解释一下两条命令

docker run -d  -e  MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7
# 启动了一个名为mysql57的容器,并初始化创建数据库wordpress
docker run -d -p 80:80 --link mysql57:mysql_host -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_HOST=mysql_host --name wordpress wordpress
#启动wordpress容器,link命令链接mysql57容器将它命名为mysql_host,然后指定数据库的密码为root,wordpress启动成功后将会自动连接mysql57容器的wordpress表

命令是简洁的,两条命令就立马启动好一个wordpress,作为一个新手的我在感慨的时候也是懵逼的,因为我心中想的是:

为什么要这么配置? 为什么是这么配置的?

其实这一点不仅仅是作为一个docker入门学习的痛点,很多技术学习也都是这样的,既学习的方式都是狼吞虎咽不咀嚼的,学习docker就把常用命令记了下来,在安装某个容器的时候去百度一下安装命令,安装上就完事了,以为自己掌握了,然而下次换了一个新的容器的时候,还是要去网上搜索什么docker xxxx 安装 这样的关键词,所以我们要会举一反三,知其所以然

1 docker学习是可以通过博客文章入门的,可以让你有迅速的了解

2 继续提升是离不开官网文档的,这样才能了解最新的docker 命令的含义以及参数,有些文章可能已经过时不再支持

3 了解镜像的详细配置请翻阅 ​​docker hub​​ 镜像的详情页,在那里你能找到绝大多数的配置参数

4 学会结合inspect命令查看镜像启动的方式,以及进入容器阅读具体的启动脚本

其实前三点都已经讲过了,前三点几乎可以整合启动所有的镜像,第四点的使用稍后再说

docker run -d  -e  MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7
# 启动了一个名为mysql57的容器,并初始化创建数据库wordpress
docker run -d -p 80:80 --link mysql57:mysql_host -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_HOST=mysql_host --name wordpress wordpress
#启动wordpress容器,link命令链接mysql57容器将它命名为mysql_host,然后指定数据库的密码为root,wordpress启动成功后将会自动连接mysql57容器的wordpress表

再看这里,link命令链接mysql57容器将它命名为mysql_host,可以理解为在wordpress容器中通过访问 http://mysql_host:3306 ,即可访问mysql57容器的数据库服务,这里的mysql_host就代表mysql57的ip

docker 网络类型

上面接触了一点docker网络方面的知识,简单聊一下,使用docker network ls 可以查看当前网络列表

目前(Docker v18.03),Docker Engine内置支持如下几种类型的网络。

  • host类型
    host网络就是Docker宿主机的网络,是Docker Engine启动即默认创建的网络之一。加入到该网络中的所有容器实例,容器实例与容器宿主机之间没有网络隔离,所以容器实例都直接使用宿主机的网络,拥有与宿主机一样的IP,使用的是宿主机的端口。(目前仅支持linux ,windows mac 不支持,2020-06-07,未来可能支持)
  • bridge类型
    Docker Engine启动即默认创建的网络之一。bridge网络的网络驱动器为bridge,即-d=bridge。
    该网络支持在同一个宿主机上的各个容器实例之间的通信。bridge网络是一个独立的网络空间,在网络空间内部的各个容器实例能够直接通信。各个容器实例都是连接到一个网桥,即docker0。新创建的容器实例默认就会加入bridge网络,即容器实例默认连接到docker0。创建容器实例可以通过使用--network指定加入到其他已有的网络。
    也可以另外创建一个定制的bridge网络,创建的bridge网络会覆盖默认的bridge网络。默认的bridge网络不支持服务的DNS自动发现,即一个容器实例要通过容器实例的name找到容器实例的IP,就无法使用该网络。定制的bridge网络,最大的好处是默认即支持服务的自动发现。
  • overlay类型
    overlay类型的网络的网络驱动器为overlay,即**-d=overlay**。该类型的网络适用于Docker宿主机集群中的各个独立的容器实例之间通信。为集群中的Docker容器实例提供跨多个Docker Engine的网络连接。
  • macvlan类型
    macvlan类型的网络的网络驱动器为macvlan,即-d=macvlan。该类型的网络适用于容器实例需要与宿主机的MAC地址直接通信,无需端口映射,也无需NAT,容器实例的eth0直接与宿主机的物理网卡通信。容器实例可以被赋予公共IP,并从宿主机外部直接访问。
  • none类型
    none网络是一个完全隔离的自治网络,甚至与Docker宿主机的网络都不通,必须手工配置网卡后才能够使用。
启动脚本 docker-compose
docker run -d  -e  MYSQL_ROOT_PASSWORD=root MYSQL_DATABASE=wordpress --name mysql57 mysql:5.7
# 启动了一个名为mysql57的容器,并初始化创建数据库wordpress
docker run -d -p 80:80 --link mysql57:mysql_host -e WORDPRESS_DB_PASSWORD=root -e WORDPRESS_DB_HOST=mysql_host --name wordpress wordpress
#启动wordpress容器,link命令链接mysql57容器将它命名为mysql_host,然后指定数据库的密码为root,wordpress启动成功后将会自动连接mysql57容器的wordpress表

再回看这两条命令,我们发现运行wordpress要两条命令并且还要配置,在以后的时候甚至还有更多镜像,那有没有简单的启动方法呢? 有的,就是使用docker-compose !

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 就是一个启动脚本的程序

新增docker-compose.yml文件,复制内容如下

mysql:
container_name: mysql
image: mysql:5.7
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=wordpress

web:
container_name: wordpress
image: wordpress
links:
- "mysql:mysql_host"
ports:
- "80:80"
environment:
- WORDPRESS_DB_HOST=mysql_host
- WORDPRESS_DB_PASSWORD=root

以上就是两条命令的整合脚本,在对应目录下启动

docker-compose up -d #后台启动脚本

从实战开始,零基础Docker入门教程_Docker_13

两个镜像就会作为一组同时被启动起来了

从实战开始,零基础Docker入门教程_Docker_14

关闭

docker-compose down

关于docker-compose在此就不做详细解释了,以后另开文章详细说明

使用image

最简单的就是使用别人做好的wordpress mysql整合包,当然这是别人做好了,所以我们才能直接用,如果没有,还是需要我们自己动手的,这里也就不说了

用法总结

docker search 
docker pull
docker run
docker ps
docker start
docker stop
docker rm
docker cp
docker image ls
docker image rm
docker-compose up -d
docker-compose down
docker exec

docker network 镜像之间的网络通信

docker volume 使用volume保存镜像数据

docker build 如何使用dockerfile构建镜像,以及dockerfile语法

docker import/export 导入导出镜像文件

docker tag 给镜像打标签

docker push 搭建私库并推送镜像进行部署

docker swarm docker集群环境的设置

以上是关于从实战开始,零基础Docker入门教程的主要内容,如果未能解决你的问题,请参考以下文章

Docker部署Rstudio Server【一】:Docker入门

从零开始,使用Docker Swarm部署集群教程

数据分析从零开始实战 | 基础篇

零基础到精通Linux,从这篇文章开始

零基础到精通Linux,从这篇文章开始

零基础到精通Linux,从这篇文章开始