docker入門看這一篇文章就夠了私爷!

一雾棺、Docker簡介

1、Docker是什么衬浑?

是一個開源的容器引擎捌浩,基于go語言開發(fā)


1

2、特點(diǎn)

輕量級工秩,可移植的

沙箱機(jī)制

開銷極低

幾個重要的名詞概念:

鏡像

容器

映射-容器連接

3尸饺、架構(gòu)

Docker 使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式进统,使用遠(yuǎn)程API來管理和創(chuàng)建Docker容器

Docker 容器通過 Docker 鏡像來創(chuàng)建

容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶ο笈c類


2


3


4

二、Docker 安裝部署(centos7 vm)

1侵佃、安裝docker環(huán)境

Centos系統(tǒng)為例:

要求:centos 7

Docker 軟件包和依賴包已經(jīng)包含在默認(rèn)的 CentOS-Extras 軟件源里麻昼,

2、安裝命令如下

2.1可以連接外網(wǎng)條件下安裝

Yum –y install docker

安裝完成后啟動docker服務(wù)

Service docker start

2.2 無法連接外網(wǎng)條件下安裝

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

直接運(yùn)行?install-docker-offline.sh安裝docker即可

3馋辈、查看docker服務(wù)狀態(tài)

Service docker status


5

Docker服務(wù)運(yùn)行正常

三抚芦、鏡像管理(mysql為例)

從docker架構(gòu)中得知,docker鏡像可以從docker鏡像倉庫下載迈螟,類似于maven中下載相關(guān)jar包叉抡,docker的鏡像倉庫:Docker Hub(https://hub.docker.com)

1、鏡像查詢

Docker search mysql

查詢結(jié)果:

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答毫、創(chuàng)建鏡像

2.1褥民、拉取鏡像(docker pull)

docker pull mysql:tag

Tag的獲取方式:直接從docker hub上獲取


6

Docker pull mysql:latest

下載鏡像

2.2、dockerFile創(chuàng)建鏡像(docker build)

在宿主機(jī)/mysql/dockerfile目錄下創(chuàng)建dockerfile文件

Mkdir –p /mysql/docker

Cd /mysql/dockerfile

Touch Dockerfile

Dockerfile文件內(nèi)容:

#由于本機(jī)已經(jīng)pull了tag為latest的mysql鏡像洗搂,以mysql:latest鏡像為基礎(chǔ)

ROM mysql:latest


#設(shè)置免密登錄

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes


#將所需文件放到容器中

COPY setup.sh /mysql/setup.sh

COPY schema.sql /mysql/schema.sql

COPY privileges.sql /mysql/privileges.sql


#設(shè)置容器啟動時執(zhí)行的命令

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

和Dockerfile相同目錄下的三個文件

???????? Setup.sh

???????? #!/bin/bash

???????? #如果語句執(zhí)行失敗就退出

set -e


#查看mysql服務(wù)的狀態(tài)消返,方便調(diào)試,這條語句可以刪除

echo `service mysql status`


echo '1.啟動mysql....'

#啟動mysql

service mysql start

sleep 3

echo `service mysql status`


echo '2.開始導(dǎo)入數(shù)據(jù)....'

#導(dǎo)入數(shù)據(jù)

mysql

echo '3.導(dǎo)入數(shù)據(jù)完畢....'


sleep 3

echo `service mysql status`


#重新設(shè)置mysql密碼

echo '4.開始修改密碼....'

mysql

echo '5.修改密碼完畢....'


#sleep 3

echo `service mysql status`

echo `mysql容器啟動完畢,且數(shù)據(jù)導(dǎo)入成功`

schema.sql:

-- 創(chuàng)建數(shù)據(jù)庫

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;


-- 插入數(shù)據(jù)

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;

-- 新建可以遠(yuǎn)程訪問的用戶docker:

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

-- 將docker_mysql數(shù)據(jù)庫的權(quán)限授權(quán)給創(chuàng)建的docker用戶耘拇,密碼為123456:

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

-- 這一條命令一定要有:

flush privileges;

總結(jié):數(shù)據(jù)初始化腳本包括sql語句一定要可以重復(fù)使用的語句撵颊,去重操作一定要有,否則后面容器做啟停操作的時候會導(dǎo)致容器無法正常運(yùn)行退出

創(chuàng)建鏡像:

docker build -t qh-mysql .??使用當(dāng)前目錄的docker File創(chuàng)建鏡像

2.3惫叛、從容器生成鏡像(docker

commit)

第一步:查看我們本地的鏡像:

Docker images

只有一個mysql的鏡像倡勇,詳細(xì)信息如下


7

第二步:查看本地的容器


8

有一個在運(yùn)行的mysql容器,id為:f25a0d544a82

???????? 第三步:使用該容器創(chuàng)建新的mysql鏡像-mysql-new

???????? Commit命令語法:

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

OPTIONS說明:

-a :提交的鏡像作者嘉涌;

-c :使用Dockerfile指令來創(chuàng)建鏡像妻熊;

-m :提交時的說明文字;

-p :在commit時仑最,將容器暫停

詳細(xì)命令:docker commit -a"qh" -m "my new mysql image" f25a0d544a82 mysq-new:v1

運(yùn)行結(jié)果如下:


8

3扔役、查看本地鏡像

docker

images


9

4、刪除鏡像

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

四词身、容器管理(mysql容器)

1厅目、生成容器

鏡像生成成功后,使用鏡像生成容器并運(yùn)行

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

使用qh-mysql鏡像創(chuàng)建容器qh2

-d:在后臺運(yùn)行

-p 13306:3306 端口映射法严,使用宿主機(jī)的13306端口映射容器的3306端口损敷,其他機(jī)器訪問容器的端口為13306,例如要想訪問qh2的mysql深啤,使用數(shù)據(jù)庫工具Navicat配置信息如下:


10

--name:容器的命名

qh-mysql:生成容器使用的鏡像名稱

2拗馒、查看容器

2.1、查詢運(yùn)行中的容器

docker?ps


11

①溯街、容器的id

②诱桂、創(chuàng)建容器的鏡像名稱

③洋丐、容器啟動時運(yùn)行的腳本

④、端口映射關(guān)系及協(xié)議

⑤挥等、容器名稱

其中1和5在容器生命周期管理時會經(jīng)常用到友绝,例如容器的啟停,刪除肝劲,容器連接迁客,查看容器詳情等

2.2、查詢所有容器包括未運(yùn)行的

docker?ps –a


12

1:未運(yùn)行的容器qh-nginx

2.3 查看某容器的詳細(xì)信息

Docker

inspect xxx


13

2.4 查看容器日志

Docker logs qh1


14

3.在容器中運(yùn)行命令

docker exec -it qh3 /bin/bash(要在處于運(yùn)行狀態(tài)的容器中)


15

退出:exit

4辞槐、啟動/停止容器

Docker start qh-mysql

Docker stop qh-mysql

5掷漱、刪除容器docker

Docker rm qh-mysql

五、數(shù)據(jù)持久化

1榄檬、踩坑-commit命令

先說下自己最開始的解決數(shù)據(jù)持久化的思路:通過commit命令

看下docker官網(wǎng)的 commit命令的詳解


16

上面有寫到基于容器的變化新建一個鏡像卜范,既然如此,那我在容器中對數(shù)據(jù)的修改應(yīng)該會保存到新生成的鏡像中鹿榜,然后我再用新鏡像new一個容器出來海雪,數(shù)據(jù)更新部分不就保存到新容器中了?

于是我在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

新建數(shù)據(jù)庫test舱殿,并在test中新建表user


19

創(chuàng)建完數(shù)據(jù)喳魏,運(yùn)行commit命令把容器生成鏡像

docker commit qh1 qh-mysql1

查看鏡像docker images


20

從結(jié)果看鏡像確實(shí)生成了,那來看看創(chuàng)建的數(shù)據(jù)是否有保存

馬上使用新鏡像new一個容器出來

連接qh-user容器


21

發(fā)現(xiàn)創(chuàng)建的庫并沒有保存下來


22

是時候求助官方文檔了怀薛,查閱了docker commit的官方文檔說明后,發(fā)現(xiàn)了在擴(kuò)展說明中有這么一句話:


23

意思是commit操作并不會包含容器內(nèi)掛載數(shù)據(jù)卷中的數(shù)據(jù)變化迷郑。難道是因?yàn)閙ysql容器的掛載數(shù)據(jù)卷引起的枝恋?

馬上查看容器信息,是否有data mount相關(guān)信息:

Docker inspect qh1

結(jié)果如下:


24

這個信息的意思就是使用volume的方式mount嗡害,把載體機(jī)的Source目錄掛載到容器的Destination目錄焚碌,下面來看如何掛載數(shù)據(jù)即如何實(shí)現(xiàn)數(shù)據(jù)持久化

2、三種數(shù)據(jù)持久化方式

2.1霸妹、volume(重點(diǎn)介紹mysql實(shí)例)

2.1.1直接掛載

前提條件:qh1是一個mysql容器十电,基于mysql:5.6鏡像生成,在qh1中手動添加了一個數(shù)據(jù)庫test叹螟,在數(shù)據(jù)庫中手動添加一個表user鹃骂,表中有三個字段:


25

我們的目的是把qh1的volume掛載到新容器中的/var/lib/mysql目錄下

首先我們要知道qh1的volume的路徑

Docker

inspect qh1查看容器


26

或者是docker inspect -f "{{.Mounts}}" qh1,切記區(qū)分大小寫


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

容器創(chuàng)建成功后查看日志畏线,看是否存在異常

Docker logs qh2

出現(xiàn)以下異常信息:


28

是兩個庫使用相同的數(shù)據(jù)文件導(dǎo)致的,解決:

關(guān)掉qh1良价,重新啟動qh2容器寝殴,再次查看qh2日志


29

啟動正常蒿叠,使用navigator連接qh2數(shù)據(jù)庫


30

注意端口號是23306


31

Test庫和user表已經(jīng)在新容器中了。

2.1.2共享方式

先看下docker官網(wǎng)的說明


32

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

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

使用navigator查看


33

Test庫和user也出現(xiàn)在了新容器中


34

2.2市咽、bind mount


35

2.3、tmpfs


36
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抵蚊,一起剝皮案震驚了整個濱河市施绎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泌射,老刑警劉巖粘姜,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熔酷,居然都是意外死亡孤紧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拒秘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來号显,“玉大人,你說我怎么就攤上這事躺酒⊙涸椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵羹应,是天一觀的道長揽碘。 經(jīng)常有香客問我,道長园匹,這世上最難降的妖魔是什么雳刺? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮裸违,結(jié)果婚禮上掖桦,老公的妹妹穿的比我還像新娘。我一直安慰自己供汛,他們只是感情好枪汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怔昨,像睡著了一般雀久。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朱监,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天岸啡,我揣著相機(jī)與錄音,去河邊找鬼赫编。 笑死巡蘸,一個胖子當(dāng)著我的面吹牛奋隶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悦荒,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唯欣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搬味?” 一聲冷哼從身側(cè)響起境氢,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碰纬,沒想到半個月后萍聊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悦析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年寿桨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片强戴。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡亭螟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骑歹,到底是詐尸還是另有隱情预烙,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布道媚,位于F島的核電站扁掸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏最域。R本人自食惡果不足惜也糊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羡宙。 院中可真熱鬧,春花似錦掐隐、人聲如沸狗热。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匿刮。三九已至,卻和暖如春探颈,著一層夾襖步出監(jiān)牢的瞬間熟丸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工伪节, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留光羞,地道東北人绩鸣。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像纱兑,于是被迫代替她去往敵國和親呀闻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容