2018-01-13Docker入門學(xué)習(xí)之一

1.Linux安裝Docker

sudo wget -qO- https//get.docker.com | sh

? ? sudo:作為普通用戶,希望以管理員的身份運(yùn)行

? ? wget:Linux的下載工具,如果沒有下載即可

? ? -q:讓wget輸出不要太多

????O-:讓wget標(biāo)準(zhǔn)輸出,而不是輸出到文件

? ??https//get.docker.com:下載地址

? ? | sh:管道的概念,從上面的網(wǎng)址下載了一個(gè)shell腳本,交給sh[shell]去執(zhí)行

? ? ? ? shell會(huì)檢測(cè)你的版本,并按照你的版本來安裝

sudo usermod -aG docker root

? ? docker 只允許root執(zhí)行,將當(dāng)前用戶加入到docker組中


????如果系統(tǒng)是CentOS7,則CentOS-Extras 庫(kù)中已帶 Docker,可以直接安裝:

yum -y install docker

????啟動(dòng),和其他的service啟動(dòng)都是一樣的

systemctl start docker

????讓docker開機(jī)啟動(dòng)

chkconfig docker on

????查看docker的相關(guān)信息

docker info

2.Docker的架構(gòu)Architectrue


Docker架構(gòu)示意圖之一

? ? DOCKER_HOST:進(jìn)行Docker操作的虛擬機(jī);

????Docker daemon:由虛擬機(jī)運(yùn)行的Docker程序,由該程序運(yùn)行各種各樣的Docker操作,如:下載Docker的鏡像;運(yùn)行一個(gè)容器;

? ? Client:客戶端,我們從客戶端給Docker daemon發(fā)起命令,進(jìn)行操作,如:docker build;docker pull;docker run;

? ? Registry:互聯(lián)網(wǎng)的一個(gè)倉(cāng)庫(kù)服務(wù),所有Docker用戶共享的一個(gè)Docker服務(wù),Docker daemon可以從其中獲取文件


Docker架構(gòu)示意圖之二

3.Docker的簡(jiǎn)單命令及解釋

Docker簡(jiǎn)單命令之一
Docker簡(jiǎn)單命令之二

? ? 3.1運(yùn)行Docker鏡像

? ??docker run ubuntu echo hello world

????通過Docker運(yùn)行ubuntu image,結(jié)束后,輸出hello world;

????如果本地的沒有,會(huì)從遠(yuǎn)端的鏡像倉(cāng)庫(kù)下載,

????查看本地images鏡像

docker images

????帶有參數(shù)的docker run

docker run -p 8080:80 -d daocloud.io/nginx

????-p : 做端口映射,8080:80,將原本的Docker的80端口,映射到本地的8080端口

????-d : 允許程序直接返回,以守護(hù)進(jìn)程的方式運(yùn)行的,并且會(huì)返回CONTAINER ID

????查看當(dāng)前運(yùn)行的Docker程序,剛才運(yùn)行了nginx服務(wù)后,可以用curl localhost:8080,進(jìn)行確認(rèn)

????3.2查看Docker容器

docker ps?

????如果沒有任何參數(shù),只會(huì)顯示當(dāng)前運(yùn)行的容器

????列出所有的docker容器:docker ps -a

????3.3將文件copy進(jìn)容器的文件夾內(nèi)

docker cp index.html 3c160b38650f://usr/share/nginx/html

????其中3c160b38650f為其CONTAINER ID

? ? 3.4停止Docker容器

docker stop 3c160b38650f

????docker stop只是將容器停止了,并沒有刪除。再次執(zhí)行docker run命令會(huì)創(chuàng)建一個(gè)新的容器。

????Docker在容器內(nèi)的操作都是沒有保存的,

? ? 3.5提交當(dāng)前運(yùn)行的容器的改動(dòng)

docker commit -m 'fun' 41835fe93f71 nginx-docker

????此命令會(huì)產(chǎn)生一個(gè)新的容器,可以在docker images中查看,后面的'nginx-docker'是其名字

? ? 3.6刪除Docker鏡像

docker rmi 300f719c1d79

? ? 3.7刪除Docker容器

docker rm?3c160b38650f 53ab421c10c9

????可以使用空格分開,刪除多個(gè)

4.Dockerfile

? ?4.1編寫Dockerfile文檔

? ??FROM alpine:latest

????MAINTAINER YuSongYuan

????CMD echo "hello docker !!!"

????alpine : 是為了docker做的一個(gè)極小的linux環(huán)境,產(chǎn)生的image會(huì)非常小

????MAINTAINER : 是告訴其他人這個(gè)鏡像是誰制作的

????CMD : 運(yùn)行一個(gè)cmd命令

? ? 4.2使用docker build命令構(gòu)建鏡像

docker build -t hello_docker .

? ? -t : 為新建的鏡像添加一個(gè)標(biāo)簽/名字,標(biāo)簽/名字為hello_docker

? ? . : 這個(gè)點(diǎn),指的是路徑,將當(dāng)前的路徑下的所有的文件都給docker engine,讓其來產(chǎn)生鏡像

????運(yùn)行之后就會(huì)在docker images中產(chǎn)生我們的剛剛創(chuàng)建的鏡像,并且標(biāo)簽/名字為hello_docker,可以運(yùn)行剛剛產(chǎn)生的鏡像,會(huì)執(zhí)行CMD后面的命令,輸出hello docker !!!

? ? ps:在build時(shí),每一個(gè)命令[FROM ,COPY ...?]都會(huì)產(chǎn)生一個(gè)新層,這些層都是只讀的,當(dāng)被運(yùn)行成為容器后,變?yōu)橐粋€(gè)整體,容器層,該層是可讀可寫的

????4.3進(jìn)階Dockerfile

????在新的目錄Dockerfile02,編寫Dockerfile文檔

FROM daocloud.io/nginx

MAINTAINER YuSongYuan

COPY index.html /usr/share/nginx/html

ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

EXPOSE 80

????FROM ubuntu : 給出基礎(chǔ)鏡像的名字

????RUN apt-get update : 使用apt-get更新ubuntu的庫(kù)

????RUN apt-get install -y nginx : 使用apt-get安裝nginx,并且不提醒

????COPY index.html /var/www/html : 將index.html文件拷貝進(jìn)該文件夾內(nèi)

????ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]?: 提供容器的入點(diǎn),會(huì)將三個(gè)內(nèi)容展開,用空格隔開,執(zhí)行;這個(gè)參數(shù)的意義是,將nginx在前臺(tái)執(zhí)行,而不是作為守護(hù)進(jìn)程來執(zhí)行

????EXPOSE 80 : 暴露一個(gè)端口,普通的http監(jiān)聽的端口

????ps:apt-get是一個(gè)和yum類似的下載安裝包的插件,如果沒有改插件,build時(shí)會(huì)報(bào)錯(cuò)

????這時(shí)候使用

docker build -t hello_nginx .

docker run -d -p 80:80 hello_nginx

????運(yùn)行后,index.html已經(jīng)被拷貝到Dockerfile中的指向的路徑,可以直接用curl localhost:80,進(jìn)行訪問,出現(xiàn)的就是index.html中的內(nèi)容

4.4Dockerfile語法

Dockerfile語法之一
Dockerfile語法之二

5.Docker的存儲(chǔ)技術(shù)Volume

????提供獨(dú)立于容器之外的持久化存儲(chǔ)

? ? 可以提供容器與容器之間共享的數(shù)據(jù)

? ? 5.1Volume操作

docker run -d --name nginx -v /usr/share/nginx/html hello_nginx

?????--name nginx : 給當(dāng)前容器一個(gè)名字 nginx

????-v?/usr/share/nginx/html : 容器內(nèi)部的一個(gè)地址,用來訪問這些網(wǎng)頁(yè)的一個(gè)地址???

docker inspect nginx

????inspect nginx : 檢查名字為 nginx的容器

????其中

"Mounts": [

? ? ? ? ? ? {

? ? ? ? ? ? ? ? "Name": "79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15",

? ? ? ? ? ? ? ? "Source": "/var/lib/docker/volumes/79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15/_data",

? ? ? ? ? ? ? ? "Destination": "/usr/share/nginx/html",

? ? ? ? ? ? ? ? "Driver": "local",

? ? ? ? ? ? ? ? "Mode": "",

? ? ? ? ? ? ? ? "RW": true,

? ? ? ? ? ? ? ? "Propagation": ""

? ? ? ? ? ? }

? ? ? ? ],

????將宿主Source中的路徑,掛載到了Destination中

????如果是linux_host,可以直接訪問Source中的路徑

ll /var/lib/docker/volumes/79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15/_data

????如果在Mac中,Source的路徑,外面還有一層虛擬層,直接訪問是無法訪問的

????可以使用

screen ~/Library/Containers/com.docker.docker/Data/com.docker.docker.amd64-linux/tty

????這個(gè)本人并未驗(yàn)證

????進(jìn)入容器中

docker exec -it nginx /bin/bash

????比如:查看我們添加進(jìn)入的index.html,首先cd /usr/share/nginx/html/,然后應(yīng)當(dāng)使用cat index.html,使用vi或vim都是找到不到命令的

????5.2掛載系統(tǒng)路徑

docker run -p 80:80 -d -v $PWD/html : /usr/share/nginx/html daocloud.io/nginx

????運(yùn)行daocloud.io/nginx鏡像,并將當(dāng)前目錄[$PWD]下的html目錄掛載到/usr/share/nginx/html 中

????這時(shí),當(dāng)我們修改html中的index.html時(shí),訪問localhost:8080的內(nèi)容也會(huì)隨之改變

????5.3掛載容器

docker creat -v $PWD/data:/var/mydata --name data_container? docker.io/alpine

????以alpine為基礎(chǔ)鏡像,創(chuàng)建一個(gè)數(shù)據(jù)鏡像,并將當(dāng)前目錄中的data掛載到/var/mydata中,起名為data_container

docker run -it --volumes-from data_container docker.io/ubuntu /bin/bash

????-it : 這里因?yàn)閐ocker.io/alpine是一個(gè)基礎(chǔ)鏡像,沒有什么服務(wù),所以用 -it :?以交互的方式運(yùn)行,需要后面加上/bin/bash

????--volumes-from : 從另外一個(gè)容器中掛載

????這里運(yùn)行后,會(huì)直接進(jìn)入到容器中,輸入下面的命令,這個(gè)命令也就是上面使用inspecte命令中,看到的其中的一個(gè)屬性

mount

????會(huì)在其中看到

/dev/mapper/centos-root on /var/mydata type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

????這時(shí)候我們可以cd??/var/mydata中,并touch ysy.txt, exit退出容器后,流量可以在data文件夾中看到y(tǒng)sy.txt

????這時(shí)說明,我們的容器掛載是成功的,一個(gè)容器可以被多個(gè)容器掛載,做到數(shù)據(jù)一致性

6.Resgitry鏡像倉(cāng)庫(kù)

????6.1術(shù)語介紹

Docker相關(guān)術(shù)語介紹

????6.2命令介紹

Docker的Registry命令

? ? 6.3Registry練習(xí)

????從遠(yuǎn)程倉(cāng)庫(kù)中搜索whalesay

docker search whalesay

????其中STAR表示獲取的星星的數(shù)量,OFFICIA是標(biāo)注是否為官方的

????從遠(yuǎn)程倉(cāng)庫(kù)下載whalesay鏡像

docker pull docker.io/docker/whalesay

? ? 下載完成后,可以用docker images命令看到本地的鏡像倉(cāng)庫(kù)中,已經(jīng)存在剛剛下載的鏡像,

? ? REPOSITORY???? ???????????????? TAG???? ???? IMAGE ID???? ???????? CREATED ???? ???? SIZE

????docker.io/docker/whalesay ? ?latest ? ? ? ? 6b362a9f73eb ???? 2 years ago ? ? ? ? 247 MB

? ??REPOSITORY : 鏡像的名字

? ???TAG : 鏡像的標(biāo)簽,latest為缺省的標(biāo)簽,當(dāng)沒有設(shè)置標(biāo)簽時(shí),這個(gè)就是其標(biāo)簽

? ? 在本地新建一個(gè)鏡像,以ysy/whalesay為其名字

? ??docker tag docker.io/docker/whalesay ysy/whalesay

????這時(shí)用docker images命令可以看到本地倉(cāng)庫(kù)中已經(jīng)多了名字為ysy/whalesay 的鏡像

7.docker-compose多容器app

? ? docker-compose是一個(gè)獨(dú)立的,用于通過文本文件拉起多容器app

? ? 7.1下載docker-compose

? ? 在linux中下載docker-compose

curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose

????其中,-$(uname -s)-$(uname -m)是獲取當(dāng)前的這兩個(gè)命令的輸出,拼接到地址中,> 是指通過管道技術(shù),下載到后面的目錄中,成為可執(zhí)行文件

[root@localhost ~]# uname -s

Linux

[root@localhost ~]# uname -m

x86_64

? ? 7.2docker-compose實(shí)戰(zhàn)

? ? ? ? 7.2.1實(shí)戰(zhàn)項(xiàng)目架構(gòu)介紹

docker-compose實(shí)戰(zhàn)項(xiàng)目結(jié)構(gòu)示意圖

? ? ? ? 7.2.2實(shí)戰(zhàn)項(xiàng)目yaml配置文件

docker-compose實(shí)戰(zhàn)項(xiàng)目yaml配置文件

? ? ? ? 7.2.3項(xiàng)目實(shí)戰(zhàn)

? ? ? ? ? ? 在ghost中創(chuàng)建三個(gè)文件夾

? ?mkdir ghost nginx data

????????????在ghost文件夾中創(chuàng)建Dockerfile文件

FROM ghost

COPY ./config.js /var/lib/ghost/config.js

EXPOSE 2368

CMD ["npm", "start", "--production"]

????????????ghost : 從官方拉取

????????????["npm", "start", "--production"] : 這個(gè)是node.js的程序,使用npm命令啟動(dòng)

? ? ? ? ? ? 在ghost文件夾中創(chuàng)建config.js文件

var path = require('path'),

config;


config = {

? ? ? ? production:{

? ? ? ? ? ? ? ? url: 'http://mytestblog.com',

? ? ? ? ? ? ? ? mail: {},

? ? ? ? ? ? ? ? database: {

? ? ? ? ? ? ? ? ? ? ? ? client: 'mysql',

? ? ? ? ? ? ? ? ? ? ? ? connection: {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? host: 'db',

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? user: 'ghost',

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? password: 'ghost',

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? database: 'ghost',

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? port: '3306',

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? charst: 'utf8'

? ? ? ? ? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? ? ? ? ? debug: false

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? paths: {

? ? ? ? ? ? ? ? ? ? ? ? contentPath: path.join(process.env.GHOST_CONTENT, '/')

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? server: {

? ? ? ? ? ? ? ? ? ? ? ? host: '0.0.0.0',

? ? ? ? ? ? ? ? ? ? ? ? prot: '2368'

? ? ? ? ? ? ? ? }

? ? ? ? }

};

? ? ? ? ? ? ? ? 在nginx中添加Dockerfile配置文件

FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

? ? ? ? ? ? ? ? 因?yàn)樵趃host中已經(jīng)有啟動(dòng)命令,所以這里就不在有啟動(dòng)命令

? ? ? ? ? ? ? ? 在nginx文件夾中添加nginx.conf文件

worker processes 4;

events {worker connections 1024;}

http {

? ? ? ? server {

? ? ? ? ? ? ? ? listen 80;

? ? ? ? ? ? ? ? lacation / {

? ? ? ? ? ? ? ? ? ? ? ? proxy pass http://ghost-app:2368;

? ? ? ? ? ? ? ? }

? ? ? ? }

}

????????????????這里是使用ghost-app這個(gè)名字指向ghost

? ? ? ? ? ? ? ? 在最外層的ghost文件夾內(nèi)創(chuàng)建docker-compose.yml文件

version: '2'

networks:

? ? ? ? ghost:

service:

? ? ? ? ghost-app:

? ? ? ? ? ? ? ? build: ghost

? ? ? ? ? ? ? ? network:

? ? ? ? ? ? ? ? ? ? ? ? - ghost

? ? ? ? ? ? ? ? depends_on:

? ? ? ? ? ? ? ? ? ? ? ? - db

? ? ? ? ? ? ? ? ports:

? ? ? ? ? ? ? ? ? ? ? ? - "2368:2368"

? ? ? ? nginx:

? ? ? ? ? ? ? ? build: nginx

? ? ? ? ? ? ? ? networks:

? ? ? ? ? ? ? ? ? ? ? ? - ghost

? ? ? ? ? ? ? ? depends_on:

? ? ? ? ? ? ? ? ? ? ? ? - ghost-app

? ? ? ? ? ? ? ? ports:

? ? ? ? ? ? ? ? ? ? ? ? - "80:80"

? ? ? ? db:

? ? ? ? ? ? ? ? image: "mysql:5.7.15"

? ? ? ? ? ? ? ? networks:

? ? ? ? ? ? ? ? ? ? ? ? - ghost

? ? ? ? ? ? ? ? environment:

? ? ? ? ? ? ? ? ? ? ? ? MYSQL_ROOT_PASSWORD: mysqlroot

? ? ? ? ? ? ? ? ? ? ? ? MYSQL_USER: ghost

? ? ? ? ? ? ? ? ? ? ? ? MYSQL_PASSWORD: ghost

? ? ? ? ? ? ? ? volumes:

? ? ? ? ? ? ? ? ? ? ? ? - $PWD/data:/var/lib/mysql

? ? ? ? ? ? ? ? ports:

? ? ? ? ? ? ? ? ? ? ? ? - “3306”

?????????????????volumes : 將數(shù)據(jù)庫(kù)的路徑掛載到容器中,這樣寫的博客就會(huì)被存下來,不會(huì)隨著容器的消失而消失

????????????????將docker-compose拉起來

docker-compose up -d

????????????????這時(shí)候訪問 localhost:80,產(chǎn)生502錯(cuò)誤,說明nginx已經(jīng)起來的,但是nginx和ghost之間鏈接有錯(cuò)誤

????????????????將nginx.conf的變量名中的空格替換為下劃線

????????????????將docker-compose停掉

docker-compose stop

????????????????將停掉的容器刪除

docker-compose rm

????????????????再次將docker-compose拉起來的時(shí)候,需要使用build命令

docker-compose build

????????????????因?yàn)榈谝淮螌ocker-compose拉起來的時(shí)候,docker-compose會(huì)自動(dòng)幫我們build鏡像,但是第二次就不會(huì)了

????????????????然后再次使用?docker-compose up -d 命令將docker-compose拉起來

????????????????訪問locallhost:80就可以正常的看到nginx的歡迎頁(yè)面

????????????????這時(shí)訪問localhost/ghost路徑,就可以自動(dòng)的跳轉(zhuǎn)到localhost/ghost/setup的路徑下面

????????????????這時(shí)表示我們的三個(gè)容器協(xié)作運(yùn)行已經(jīng)是沒問題的了

????????????????本人的docker-compose沒有下載完成,暫未測(cè)試

????????7.2.4docker-compose常用命令

docker-compose.yml常用參數(shù)
docker-compose常用命令
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker — 云時(shí)代的程序分發(fā)方式 要說最近一年云計(jì)算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,828評(píng)論 15 147
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,728評(píng)論 0 120
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國(guó)...
    Blazzer閱讀 3,239評(píng)論 0 13
  • 0. 前言 docker是什么?docker是用GO語言開發(fā)的應(yīng)用容器引擎,基于容器化,沙箱機(jī)制的應(yīng)用部署技術(shù)。可...
    sessionboy閱讀 4,000評(píng)論 2 49
  • 前好些時(shí)候終于想明白了自己,走出了這段漫長(zhǎng)的迷茫期,欣慰。 也在努力的去豐富自己的人生,老了也可以當(dāng)故事說給我的子...
    VickyJ閱讀 1,511評(píng)論 0 0

友情鏈接更多精彩內(nèi)容