一雾棺、Docker簡介
1、Docker是什么衬浑?
是一個開源的容器引擎捌浩,基于go語言開發(fā)
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類
二、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
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上獲取
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ì)信息如下
第二步:查看本地的容器
有一個在運(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é)果如下:
3扔役、查看本地鏡像
docker
images
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配置信息如下:
--name:容器的命名
qh-mysql:生成容器使用的鏡像名稱
2拗馒、查看容器
2.1、查詢運(yùn)行中的容器
docker?ps
①溯街、容器的id
②诱桂、創(chuàng)建容器的鏡像名稱
③洋丐、容器啟動時運(yùn)行的腳本
④、端口映射關(guān)系及協(xié)議
⑤挥等、容器名稱
其中1和5在容器生命周期管理時會經(jīng)常用到友绝,例如容器的啟停,刪除肝劲,容器連接迁客,查看容器詳情等
2.2、查詢所有容器包括未運(yùn)行的
docker?ps –a
1:未運(yùn)行的容器qh-nginx
2.3 查看某容器的詳細(xì)信息
Docker
inspect xxx
2.4 查看容器日志
Docker logs qh1
3.在容器中運(yùn)行命令
docker exec -it qh3 /bin/bash(要在處于運(yùn)行狀態(tài)的容器中)
退出: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命令的詳解
上面有寫到基于容器的變化新建一個鏡像卜范,既然如此,那我在容器中對數(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
使用navigator連接mysql容器
配置信息如下:
新建數(shù)據(jù)庫test舱殿,并在test中新建表user
創(chuàng)建完數(shù)據(jù)喳魏,運(yùn)行commit命令把容器生成鏡像
docker commit qh1 qh-mysql1
查看鏡像docker images
從結(jié)果看鏡像確實(shí)生成了,那來看看創(chuàng)建的數(shù)據(jù)是否有保存
馬上使用新鏡像new一個容器出來
連接qh-user容器
發(fā)現(xiàn)創(chuàng)建的庫并沒有保存下來
是時候求助官方文檔了怀薛,查閱了docker commit的官方文檔說明后,發(fā)現(xiàn)了在擴(kuò)展說明中有這么一句話:
意思是commit操作并不會包含容器內(nèi)掛載數(shù)據(jù)卷中的數(shù)據(jù)變化迷郑。難道是因?yàn)閙ysql容器的掛載數(shù)據(jù)卷引起的枝恋?
馬上查看容器信息,是否有data mount相關(guān)信息:
Docker inspect qh1
結(jié)果如下:
這個信息的意思就是使用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鹃骂,表中有三個字段:
我們的目的是把qh1的volume掛載到新容器中的/var/lib/mysql目錄下
首先我們要知道qh1的volume的路徑
Docker
inspect qh1查看容器
或者是docker inspect -f "{{.Mounts}}" qh1,切記區(qū)分大小寫
找到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)以下異常信息:
是兩個庫使用相同的數(shù)據(jù)文件導(dǎo)致的,解決:
關(guān)掉qh1良价,重新啟動qh2容器寝殴,再次查看qh2日志
啟動正常蒿叠,使用navigator連接qh2數(shù)據(jù)庫
注意端口號是23306
Test庫和user表已經(jīng)在新容器中了。
2.1.2共享方式
先看下docker官網(wǎng)的說明
只需要指定共享源蚣常,命令如下:
docker run --name qh3 --volumes-from qh1 -d-p 33306:3306 mysql:5.6
使用navigator查看
Test庫和user也出現(xiàn)在了新容器中
2.2市咽、bind mount
2.3、tmpfs