docker入门看这一篇文章就够了!

一、Docker简介

1、Docker是什么?

是一个开源的容器引擎,基于go语言开发


1

2、特点

轻量级,可移植的

沙箱机制

开销极低

几个重要的名词概念:

镜像

容器

映射-容器连接

3、架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器

Docker 容器通过 Docker 镜像来创建

容器与镜像的关系类似于面向对象编程中的对象与类


2


3


4

二、Docker 安装部署(centos7 vm)

1、安装docker环境

Centos系统为例:

要求:centos 7

Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,

2、安装命令如下

2.1可以连接外网条件下安装

Yum –y install docker

安装完成后启动docker服务

Service docker start

2.2 无法连接外网条件下安装

https://gitee.com/kennylee/install-docker

直接运行 install-docker-offline.sh安装docker即可

3、查看docker服务状态

Service docker status


5

Docker服务运行正常

三、镜像管理(mysql为例)

从docker架构中得知,docker镜像可以从docker镜像仓库下载,类似于maven中下载相关jar包,docker的镜像仓库:Docker Hub(https://hub.docker.com)

1、镜像查询

Docker search mysql

查询结果:

INDEX      NAME                                                            DESCRIPTION                                     STARS     OFFICIAL  AUTOMATED

docker.io  docker.io/mysql                                                 MySQL is a widely used, open-source relati...   5122     [OK]      

docker.io  docker.io/mariadb                                               MariaDB is a community-developed fork of M...   1588     [OK]      

docker.io  docker.io/mysql/mysql-server                                     OptimizedMySQL Server Docker images. Crea...  358                  [OK]

docker.io  docker.io/percona                                               Percona Server is a fork of the MySQL rela...   297      [OK]      

docker.io  docker.io/hypriot/rpi-mysql                                     RPi-compatible Docker Image with Mysql          70                  

docker.io  docker.io/zabbix/zabbix-server-mysql                             Zabbix Server withMySQL database support       62                   [OK]

docker.io  docker.io/centurylink/mysql                                      Imagecontaining mysql. Optimized to be li...  53                   [OK]

docker.io  docker.io/sameersbn/mysql                                                                                        47                   [OK]

docker.io  docker.io/zabbix/zabbix-web-nginx-mysql                          Zabbix frontend basedon Nginx web-server ...   35                   [OK]

docker.io   docker.io/tutum/mysql                                           Base docker image to run a MySQL database ...   27                  

docker.io  docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          16                   [OK]

docker.io  docker.io/schickling/mysql-backup-s3                             Backup MySQL to S3(supports periodic back...   16                   [OK]

docker.io  docker.io/centos/mysql-57-centos7                                MySQL 5.7 SQLdatabase server                   12                  

docker.io  docker.io/linuxserver/mysql                                      A Mysqlcontainer, brought to you by Linux...  12                  

docker.io  docker.io/openshift/mysql-55-centos7                             DEPRECATED: ACentos7 based MySQL v5.5 ima...   6                   

docker.io  docker.io/centos/mysql-56-centos7                                MySQL 5.6 SQLdatabase server                   5                   

docker.io  docker.io/dsteinkopf/backup-all-mysql                            backup all DBs in amysql server                3                    [OK]

docker.io  docker.io/frodenas/mysql                                         ADocker Image for MySQL                        3                    [OK]

docker.io  docker.io/circleci/mysql                                         MySQLis a widely used, open-source relati...  2                   

docker.io  docker.io/ansibleplaybookbundle/rhscl-mysql-apb                  An APB which deploys RHSCL MySQL                0                    [OK]

docker.io  docker.io/astronomerio/mysql-sink                                MySQL sink                                      0                    [OK]

docker.io  docker.io/astronomerio/mysql-source                              MySQL source                                    0                    [OK]

docker.io  docker.io/cloudfoundry/cf-mysql-ci                               Image used in CIof cf-mysql-release            0                   

docker.io  docker.io/cloudposse/mysql                                       Improved`mysql` service with support for ...   0                    [OK]

docker.io   docker.io/jenkler/mysql                                         Docker Mysql package                            0

2、创建镜像

2.1、拉取镜像(docker pull)

docker pull mysql:tag

Tag的获取方式:直接从docker hub上获取


6

Docker pull mysql:latest

下载镜像

2.2、dockerFile创建镜像(docker build)

在宿主机/mysql/dockerfile目录下创建dockerfile文件

Mkdir –p /mysql/docker

Cd /mysql/dockerfile

Touch Dockerfile

Dockerfile文件内容:

#由于本机已经pull了tag为latest的mysql镜像,以mysql:latest镜像为基础

ROM mysql:latest


#设置免密登录

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes


#将所需文件放到容器中

COPY setup.sh /mysql/setup.sh

COPY schema.sql /mysql/schema.sql

COPY privileges.sql /mysql/privileges.sql


#设置容器启动时执行的命令

CMD ["sh", "/mysql/setup.sh"]      

和Dockerfile相同目录下的三个文件

         Setup.sh

         #!/bin/bash

         #如果语句执行失败就退出

set -e


#查看mysql服务的状态,方便调试,这条语句可以删除

echo `service mysql status`


echo '1.启动mysql....'

#启动mysql

service mysql start

sleep 3

echo `service mysql status`


echo '2.开始导入数据....'

#导入数据

mysql

echo '3.导入数据完毕....'


sleep 3

echo `service mysql status`


#重新设置mysql密码

echo '4.开始修改密码....'

mysql

echo '5.修改密码完毕....'


#sleep 3

echo `service mysql status`

echo `mysql容器启动完毕,且数据导入成功`

schema.sql:

-- 创建数据库

DROP DATABASE IF EXISTS `docker_mysql`;

create database `docker_mysql` defaultcharacter set utf8 collate utf8_general_ci;


use docker_mysql;


-- 建表

DROP TABLE IF EXISTS `user`;


CREATE TABLE `user` (

 `id`bigint(20) NOT NULL,

 `created_at` bigint(40) DEFAULT NULL,

 `last_modified` bigint(40) DEFAULT NULL,

 `email`varchar(255) DEFAULT NULL,

 `first_name` varchar(255) DEFAULT NULL,

 `last_name` varchar(255) DEFAULT NULL,

 `username` varchar(255) DEFAULT NULL,

 PRIMARYKEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;


-- 插入数据

replace INTO `user` (`id`, `created_at`,`last_modified`, `email`, `first_name`, `last_name`, `username`)

VALUES

 (0,1490257904,1490257904,'john.doe@example.com','John','Doe','user');

privileges.sql:

use mysql;

DELETE from userwhere User='docker';

select host, userfrom user;

-- 新建可以远程访问的用户docker:

GRANT USAGE ON *.*TO 'docker'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;

-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:

GRANT ALL PRIVILEGESON *.* TO 'docker'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

-- 这一条命令一定要有:

flush privileges;

总结:数据初始化脚本包括sql语句一定要可以重复使用的语句,去重操作一定要有,否则后面容器做启停操作的时候会导致容器无法正常运行退出

创建镜像:

docker build -t qh-mysql .  使用当前目录的docker File创建镜像

2.3、从容器生成镜像(docker

commit)

第一步:查看我们本地的镜像:

Docker images

只有一个mysql的镜像,详细信息如下


7

第二步:查看本地的容器


8

有一个在运行的mysql容器,id为:f25a0d544a82

         第三步:使用该容器创建新的mysql镜像-mysql-new

         Commit命令语法:

         dockercommit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

-a :提交的镜像作者;

-c :使用Dockerfile指令来创建镜像;

-m :提交时的说明文字;

-p :在commit时,将容器暂停

详细命令:docker commit -a"qh" -m "my new mysql image" f25a0d544a82 mysq-new:v1

运行结果如下:


8

3、查看本地镜像

docker

images


9

4、删除镜像

docker rmi qh-mysql(名称或者id)

四、容器管理(mysql容器)

1、生成容器

镜像生成成功后,使用镜像生成容器并运行

docker run -d -p 13306:3306 --name qh2 qh-mysql

使用qh-mysql镜像创建容器qh2

-d:在后台运行

-p 13306:3306 端口映射,使用宿主机的13306端口映射容器的3306端口,其他机器访问容器的端口为13306,例如要想访问qh2的mysql,使用数据库工具Navicat配置信息如下:


10

--name:容器的命名

qh-mysql:生成容器使用的镜像名称

2、查看容器

2.1、查询运行中的容器

docker ps


11

①、容器的id

②、创建容器的镜像名称

③、容器启动时运行的脚本

④、端口映射关系及协议

⑤、容器名称

其中1和5在容器生命周期管理时会经常用到,例如容器的启停,删除,容器连接,查看容器详情等

2.2、查询所有容器包括未运行的

docker ps –a


12

1:未运行的容器qh-nginx

2.3 查看某容器的详细信息

Docker

inspect xxx


13

2.4 查看容器日志

Docker logs qh1


14

3.在容器中运行命令

docker exec -it qh3 /bin/bash(要在处于运行状态的容器中)


15

退出:exit

4、启动/停止容器

Docker start qh-mysql

Docker stop qh-mysql

5、删除容器docker

Docker rm qh-mysql

五、数据持久化

1、踩坑-commit命令

先说下自己最开始的解决数据持久化的思路:通过commit命令

看下docker官网的 commit命令的详解


16

上面有写到基于容器的变化新建一个镜像,既然如此,那我在容器中对数据的修改应该会保存到新生成的镜像中,然后我再用新镜像new一个容器出来,数据更新部分不就保存到新容器中了?

于是我在5.6版本mysql的镜像上new了一个容器出来:

docker run -p 3306:3306 --name qh1 -e MYSQL_ROOT_PASSWORD=123456-d mysql:5.6

查看容器docker ps


17

使用navigator连接mysql容器

配置信息如下:


18

新建数据库test,并在test中新建表user


19

创建完数据,运行commit命令把容器生成镜像

docker commit qh1 qh-mysql1

查看镜像docker images


20

从结果看镜像确实生成了,那来看看创建的数据是否有保存

马上使用新镜像new一个容器出来

连接qh-user容器


21

发现创建的库并没有保存下来


22

是时候求助官方文档了,查阅了docker commit的官方文档说明后,发现了在扩展说明中有这么一句话:


23

意思是commit操作并不会包含容器内挂载数据卷中的数据变化。难道是因为mysql容器的挂载数据卷引起的?

马上查看容器信息,是否有data mount相关信息:

Docker inspect qh1

结果如下:


24

这个信息的意思就是使用volume的方式mount,把载体机的Source目录挂载到容器的Destination目录,下面来看如何挂载数据即如何实现数据持久化

2、三种数据持久化方式

2.1、volume(重点介绍mysql实例)

2.1.1直接挂载

前提条件:qh1是一个mysql容器,基于mysql:5.6镜像生成,在qh1中手动添加了一个数据库test,在数据库中手动添加一个表user,表中有三个字段:


25

我们的目的是把qh1的volume挂载到新容器中的/var/lib/mysql目录下

首先我们要知道qh1的volume的路径

Docker

inspect qh1查看容器


26

或者是docker inspect -f "{{.Mounts}}" qh1,切记区分大小写


27

找到qh1的volume路径为:/var/lib/docker/volumes/1de10c2b4efb8a3f8a64eb20ab44f916544ca782fa49956c7c87825aa064e179/_data

新建名称为qh2的mysql新容器,命令如下;

docker run -it -p 23306:3306 --name qh2 -v/var/lib/docker/volumes/1de10c2b4efb8a3f8a64eb20ab44f916544ca782fa49956c7c87825aa064e179/_data:/var/lib/mysql-e MYSQL_ROOT_PASSWORD=123456 --privileged=true -d mysql:5.6

容器创建成功后查看日志,看是否存在异常

Docker logs qh2

出现以下异常信息:


28

是两个库使用相同的数据文件导致的,解决:

关掉qh1,重新启动qh2容器,再次查看qh2日志


29

启动正常,使用navigator连接qh2数据库


30

注意端口号是23306


31

Test库和user表已经在新容器中了。

2.1.2共享方式

先看下docker官网的说明


32

只需要指定共享源,命令如下:

docker run --name qh3 --volumes-from qh1 -d-p 33306:3306 mysql:5.6

使用navigator查看


33

Test库和user也出现在了新容器中


34

2.2、bind mount


35

2.3、tmpfs


36
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容