Docker基本概念
l.????鏡像(Image):Docker 鏡像(Image),就相當(dāng)于是一個(gè) root 文件系統(tǒng)。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統(tǒng)的 root 文件系統(tǒng)门怪。
2.????容器(Container):鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類和實(shí)例一樣,鏡像是靜態(tài)的定義价卤,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建渊涝、啟動(dòng)慎璧、停止、刪除跨释、暫停等胸私。
3.????倉庫(Repository):倉庫可看成一個(gè)代碼控制中心,用來保存鏡像鳖谈。
Docker的場(chǎng)景和優(yōu)點(diǎn)
場(chǎng)景:
1.????Web 應(yīng)用的自動(dòng)化打包和發(fā)布岁疼。
2.????自動(dòng)化測(cè)試和持續(xù)集成、發(fā)布缆娃。
3.????在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺(tái)應(yīng)用捷绒。
4.????從頭編譯或者擴(kuò)展現(xiàn)有的 OpenShift 或 Cloud Foundry 平臺(tái)來搭建自己的 PaaS 環(huán)境
優(yōu)點(diǎn):
1.????快速,一致地交付您的應(yīng)用程序
2.????響應(yīng)式部署和擴(kuò)展
3.????在同一硬件上運(yùn)行更多工作負(fù)載
? ? ? ? 總的來說:?Docker是一個(gè)用于開發(fā)贯要,交付和運(yùn)行應(yīng)用程序的開放平臺(tái)暖侨。Docker 使您能夠?qū)?yīng)用程序與基礎(chǔ)架構(gòu)分開,從而可以快速交付軟件崇渗。借助 Docker字逗,您可以與管理應(yīng)用程序相同的方式來管理基礎(chǔ)架構(gòu)。通過利用 Docker 的方法來快速交付宅广,測(cè)試和部署代碼葫掉,您可以大大減少編寫代碼和在生產(chǎn)環(huán)境中運(yùn)行代碼之間的延遲。
Docker安裝與常用命令
1.????在線安裝:??
(若網(wǎng)絡(luò)獲取不到插件庫這里列表centos8更換源,見末尾細(xì)節(jié)總結(jié))
2.????容器使用
docker ps 查看啟用的容器(docker container ls)
docker ps –a 查看所有容器
docker exec –it [容器id]? /bin/bash進(jìn)入容器跟狱,exit不會(huì)停止容器
docker start/stop/restart 容器id 操作容器
docker export [容器id] > ubuntu.tar 導(dǎo)出容器
cat ubuntu.tar | docker import -test/ubuntu:v1 導(dǎo)入容器
docker rm –f [容器id]刪除容器
docker stop $(docker ps -q) 停用全部運(yùn)行中的容器
docker rm $(docker ps -aq) 刪除全部容器
docker run –t –id java:new /bin/bash 后臺(tái)創(chuàng)建啟動(dòng)java:new鏡像(精簡版)
docker run -itd -p 55556:22 -p 9001:80 -p 33306:3306??-v /home/dock/Downloads:/usr/Downloads--name=web1 --privileged=true java_web /sbin/init
這里安裝順序映射了三個(gè)端口ssh,nginx,mysql
privileged=true /sbin/init:使你在容器擁有root權(quán)限,如可以systemctl service等
-v掛載:指定宿主機(jī)和docker容器的目前(--volumes-from也是掛載方式)
3.????鏡像使用
docker search xx 搜索鏡像
docker pull xx 拉去鏡像
docker images 鏡像列表
docker rmi [鏡像名稱] 刪除鏡像
4.????鏡像制作與更新
1.創(chuàng)建一個(gè)新的鏡像
1.????準(zhǔn)備一個(gè)Dockerfile文件,命名一致
2.????寫入命令,如:
FROM centos7?//拉取鏡像
MAINTRAINER xx //指定作者
RUN yum intasll –y nginx //第一步安裝nginx
EXPOSE 80 //第一步開放80端口
…
3.????當(dāng)前Dockerfile目錄 執(zhí)行 docker build -t name:v1.0
2.????更新成一個(gè)新的鏡像
docker commit-m="jdk8_nginx_mysql5_ssh" -a="zhuhai" edce7b3d8789java_web
-m:描述–a:作者 java_web:鏡像名edce7b3d8789:當(dāng)前容器id
安裝ssh服務(wù)
1.????yum install openssh-server
2.配置密碼
mkdir /var/run/sshd
echo 'root:zhuhai123' | chpasswd
# 這里使用你自己想設(shè)置的用戶名和密碼俭厚,但是一定要記住兽肤!
sed -i 's/PermitRootLogin prohibit-password/PermitRootLoginyes/' /etc/ssh/sshd_config
sed 's@session\s*required\s*pam_loginuid.so@sessionoptional pam_loginuid.so@g' -i /etc/pam.d/sshd
echo "export VISIBLE=now" >> /etc/profile
3.修改配置文件
將PermitRootLogin改為yes
去掉PasswordAuthentication
yes前的#
再重啟ssh
systemctlrestart sshd.service/service sshd restart
4.????驗(yàn)證登錄
sshroot@10.197.237.197 -p 55555
這里的55555 是docker容器的映射的22
注修改ssh密碼echo 'root:passwd' | chpasswd
重啟即可? systemctl restart sshd.service/service sshdrestart
安裝環(huán)境工具jdk,nginx,mysql
方式一:在線安裝yum…
方式二:本地stfp工具拷貝
方式三:從宿主機(jī)拷貝這里
既然學(xué)習(xí)docker這里就介紹第三種:
準(zhǔn)備文件,這里準(zhǔn)備數(shù)據(jù)
1.????把文件遠(yuǎn)程拷貝到宿主機(jī)
scp jdk-8u231-linux-x64.tar.gzroot@10.197.237.197:/opt
2.????把宿主機(jī)數(shù)據(jù)拷貝到docker容器
docker cp jdk-8u231-linux-x64.tar.gz? edce7b3d8789:/opt/
docker cp -a ../temp?edce7b3d8789:/opt/ai-authorize/temp(文件夾遞歸復(fù)制)
edce7b3d8789這里是容器的id
3.????解壓安裝跳過
4.????安裝完成這里把更新后的容器打成鏡像,方便部署環(huán)境的移植
docker commit -m="jdk8_nginx_mysql5_ssh"-a="zhuhai" edce7b3d8789 java_web
-m:描述–a:作者java_web:鏡像名edce7b3d8789:當(dāng)前容器id
5.? ????使用新鏡像創(chuàng)建容器
docker run -itd -p55556:22 -p 9001:80 -p 33306:3306 --name=web1 --privileged=true java_web/sbin/init
這里安裝順序映射了三個(gè)端口ssh,nginx,mysql
privileged=true /sbin/init:使你在容器擁有root權(quán)限,如可以systemctl service等
學(xué)習(xí)網(wǎng)站(https://www.runoob.com/docker/docker-tutorial.html)
問題總結(jié):
1. centos8更換源
? ?cd /etc/yum.repos.d/
??mkdir bak
?? mv * bak
curl -o /etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repo
??yum makecache
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2.???? 網(wǎng)絡(luò)問題
?? ?Docker容器的網(wǎng)絡(luò)模式有四種:
Bridge 橋接模式(默認(rèn),不需要指定):推薦使用
Host 網(wǎng)絡(luò)模式(使用后,不能再指定端口)
Container 網(wǎng)絡(luò)模式
None 網(wǎng)絡(luò)模式
?????? 這里在學(xué)習(xí)時(shí)遇到一個(gè)問題,初期使用了centos7的系統(tǒng),docker安裝后,docker容器ping網(wǎng)橋和宿主機(jī)ping網(wǎng)橋都能通信,但是docker和宿主機(jī)不通信,后來查詢使用一些自定義網(wǎng)橋等等..措施還是無濟(jì)于事,后來嘗試更新了系統(tǒng),就解決了,查詢問題在于原centos7系統(tǒng)安裝的內(nèi)核版本過低無法和docker的網(wǎng)絡(luò)機(jī)制兼容,所以建議使用centos7系統(tǒng),最好使用高內(nèi)核版本.
3. ????服務(wù)器實(shí)際時(shí)間和java服務(wù)時(shí)間相差8小時(shí):
排查問題:
[if !supportLists]1.????[endif]服務(wù)器問題:date –R 若東八區(qū)則沒問題
[if !supportLists]2.????[endif]Mysql服務(wù)器時(shí)區(qū):開發(fā)本地測(cè)試過沒問題select Now();
[if !supportLists]3.????[endif]Jdk時(shí)區(qū):項(xiàng)目中l(wèi)og輸出時(shí)區(qū),如TimeZone.getDefault(),這里是UTC,國際標(biāo)準(zhǔn)時(shí)區(qū),問題所在
修改:項(xiàng)目啟動(dòng)設(shè)置時(shí)區(qū),這里介紹springboot項(xiàng)目
這里我的jar包測(cè)試過只有第三種實(shí)際生效
1套腹、在啟動(dòng)類
@PostConstruct
void setDefaultTimezone() {
?TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
2、在application.properties加上
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Shanghai
3资铡、在啟動(dòng)類 啟動(dòng)run方法里加上
public static void main(String[] args) {
?TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(BaseMicroServiceApplication.class, args);
}
4. ????nignx代理配置問題
???????listen?????? 80; //頁面輸入的端口映射為服務(wù)的80端口
???????server_name? localhost;
???????location / {??? //頁面不輸入請(qǐng)求實(shí)際地址电禀,代理指向首頁
???????????root?? html;
???????????index? index.html index.htm;
???????}
???????location /api {
?????????proxy_pass http://127.0.0.1:33330/api/;
???????}
? ??????//這里配置/api,區(qū)分時(shí)代理到前端頁面還是后端請(qǐng)求笤休,所以這里加上前綴尖飞,ngnix檢查到/api會(huì)代理去請(qǐng)求配置的容器內(nèi)服務(wù)的33330端口的實(shí)際后臺(tái)請(qǐng)求,這里服務(wù)也許要配置前綴。
5.????掛載數(shù)據(jù)庫數(shù)據(jù)
這里考慮政基,一臺(tái)宿主機(jī)可能運(yùn)行多個(gè)docker容器贞铣,如果數(shù)據(jù)庫數(shù)據(jù)存儲(chǔ)在容器中,崩潰則會(huì)出險(xiǎn)數(shù)據(jù)丟失等風(fēng)險(xiǎn)問題沮明,所以這里使用掛載把容器中的數(shù)據(jù)掛載一份到宿主機(jī)中辕坝,這樣就算容器崩潰了,新建容器也可以恢復(fù)數(shù)據(jù)荐健,下面簡單命令:
docker run –v /opt/bak/web_app/mysql/data:/opt/mysql/data…
冒號(hào):前是宿主機(jī)目錄酱畅,后是容器目錄,不存在容器run后會(huì)自動(dòng)創(chuàng)建路徑江场,注意使用絕對(duì)路徑
web_app:是啟動(dòng)是--name指定的創(chuàng)建者纺酸,這里便于崩潰了后根據(jù)name定位該容器的對(duì)應(yīng)數(shù)據(jù)