1.Linux安裝Docker
sudo wget -qO- https//get.docker.com | sh
? ? sudo:作為普通用戶,希望以管理員的身份運行
? ? wget:Linux的下載工具,如果沒有下載即可
? ? -q:讓wget輸出不要太多
????O-:讓wget標準輸出,而不是輸出到文件
? ??https//get.docker.com:下載地址
? ? | sh:管道的概念,從上面的網(wǎng)址下載了一個shell腳本,交給sh[shell]去執(zhí)行
? ? ? ? shell會檢測你的版本,并按照你的版本來安裝
sudo usermod -aG docker root
? ? docker 只允許root執(zhí)行斋扰,將當前用戶加入到docker組中
????如果系統(tǒng)是CentOS7,則CentOS-Extras 庫中已帶 Docker渡八,可以直接安裝:
yum -y install docker
????啟動,和其他的service啟動都是一樣的
systemctl start docker
????讓docker開機啟動
chkconfig docker on
????查看docker的相關(guān)信息
docker info
2.Docker的架構(gòu)Architectrue
? ? DOCKER_HOST:進行Docker操作的虛擬機;
????Docker daemon:由虛擬機運行的Docker程序,由該程序運行各種各樣的Docker操作,如:下載Docker的鏡像;運行一個容器;
? ? Client:客戶端,我們從客戶端給Docker daemon發(fā)起命令,進行操作,如:docker build;docker pull;docker run;
? ? Registry:互聯(lián)網(wǎng)的一個倉庫服務(wù),所有Docker用戶共享的一個Docker服務(wù),Docker daemon可以從其中獲取文件
3.Docker的簡單命令及解釋
? ? 3.1運行Docker鏡像
? ??docker run ubuntu echo hello world
????通過Docker運行ubuntu image,結(jié)束后,輸出hello world;
????如果本地的沒有,會從遠端的鏡像倉庫下載,
????查看本地images鏡像
docker images
????帶有參數(shù)的docker run
docker run -p 8080:80 -d daocloud.io/nginx
????-p : 做端口映射,8080:80,將原本的Docker的80端口,映射到本地的8080端口
????-d : 允許程序直接返回,以守護進程的方式運行的,并且會返回CONTAINER ID
????查看當前運行的Docker程序,剛才運行了nginx服務(wù)后,可以用curl localhost:8080,進行確認
????3.2查看Docker容器
docker ps?
????如果沒有任何參數(shù),只會顯示當前運行的容器
????列出所有的docker容器:docker ps -a
????3.3將文件copy進容器的文件夾內(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命令會創(chuàng)建一個新的容器屎鳍。
????Docker在容器內(nèi)的操作都是沒有保存的,
? ? 3.5提交當前運行的容器的改動
docker commit -m 'fun' 41835fe93f71 nginx-docker
????此命令會產(chǎn)生一個新的容器,可以在docker images中查看,后面的'nginx-docker'是其名字
? ? 3.6刪除Docker鏡像
docker rmi 300f719c1d79
? ? 3.7刪除Docker容器
docker rm?3c160b38650f 53ab421c10c9
????可以使用空格分開,刪除多個
4.Dockerfile
? ?4.1編寫Dockerfile文檔
? ??FROM alpine:latest
????MAINTAINER YuSongYuan
????CMD echo "hello docker !!!"
????alpine : 是為了docker做的一個極小的linux環(huán)境,產(chǎn)生的image會非常小
????MAINTAINER : 是告訴其他人這個鏡像是誰制作的
????CMD : 運行一個cmd命令
? ? 4.2使用docker build命令構(gòu)建鏡像
docker build -t hello_docker .
? ? -t : 為新建的鏡像添加一個標簽/名字,標簽/名字為hello_docker
? ? . : 這個點,指的是路徑,將當前的路徑下的所有的文件都給docker engine,讓其來產(chǎn)生鏡像
????運行之后就會在docker images中產(chǎn)生我們的剛剛創(chuàng)建的鏡像,并且標簽/名字為hello_docker,可以運行剛剛產(chǎn)生的鏡像,會執(zhí)行CMD后面的命令,輸出hello docker !!!
? ? ps:在build時,每一個命令[FROM ,COPY ...?]都會產(chǎn)生一個新層,這些層都是只讀的,當被運行成為容器后,變?yōu)橐粋€整體,容器層,該層是可讀可寫的
????4.3進階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的庫
????RUN apt-get install -y nginx : 使用apt-get安裝nginx,并且不提醒
????COPY index.html /var/www/html : 將index.html文件拷貝進該文件夾內(nèi)
????ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]?: 提供容器的入點,會將三個內(nèi)容展開,用空格隔開,執(zhí)行;這個參數(shù)的意義是,將nginx在前臺執(zhí)行,而不是作為守護進程來執(zhí)行
????EXPOSE 80 : 暴露一個端口,普通的http監(jiān)聽的端口
????ps:apt-get是一個和yum類似的下載安裝包的插件,如果沒有改插件,build時會報錯
????這時候使用
docker build -t hello_nginx .
docker run -d -p 80:80 hello_nginx
????運行后,index.html已經(jīng)被拷貝到Dockerfile中的指向的路徑,可以直接用curl localhost:80,進行訪問,出現(xiàn)的就是index.html中的內(nèi)容
4.4Dockerfile語法
5.Docker的存儲技術(shù)Volume
????提供獨立于容器之外的持久化存儲
? ? 可以提供容器與容器之間的共享的數(shù)據(jù)
? ? 5.1Volume操作
docker run -d --name nginx -v /usr/share/nginx/html hello_nginx
?????--name nginx : 給當前容器一個名字 nginx
????-v?/usr/share/nginx/html : 容器內(nèi)部的一個地址,用來訪問這些網(wǎng)頁的一個地址???
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
????這個本人并未驗證
????進入容器中
docker exec -it nginx /bin/bash
????比如:查看我們添加進入的index.html,首先cd /usr/share/nginx/html/,然后應(yī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
????運行daocloud.io/nginx鏡像,并將當前目錄[$PWD]下的html目錄掛載到/usr/share/nginx/html 中
????這時,當我們修改html中的index.html時,訪問localhost:8080的內(nèi)容也會隨之改變
????5.3掛載容器
docker creat -v $PWD/data:/var/mydata --name data_container? docker.io/alpine
????以alpine為基礎(chǔ)鏡像,創(chuàng)建一個數(shù)據(jù)鏡像,并將當前目錄中的data掛載到/var/mydata中,起名為data_container
docker run -it --volumes-from data_container docker.io/ubuntu /bin/bash
????-it : 這里因為docker.io/alpine是一個基礎(chǔ)鏡像,沒有什么服務(wù),所以用 -it :?以交互的方式運行,需要后面加上/bin/bash
????--volumes-from : 從另外一個容器中掛載
????這里運行后,會直接進入到容器中,輸入下面的命令,這個命令也就是上面使用inspecte命令中,看到的其中的一個屬性
mount
????會在其中看到
/dev/mapper/centos-root on /var/mydata type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
????這時候我們可以cd??/var/mydata中,并touch ysy.txt, exit退出容器后,流量可以在data文件夾中看到y(tǒng)sy.txt
????這時說明,我們的容器掛載是成功的,一個容器可以被多個容器掛載,做到數(shù)據(jù)一致性
6.Resgitry鏡像倉庫
????6.1術(shù)語介紹
????6.2命令介紹
? ? 6.3Registry練習
????從遠程倉庫中搜索whalesay
docker search whalesay
????其中STAR表示獲取的星星的數(shù)量,OFFICIA是標注是否為官方的
????從遠程倉庫下載whalesay鏡像
docker pull docker.io/docker/whalesay
? ? 下載完成后,可以用docker images命令看到本地的鏡像倉庫中,已經(jīng)存在剛剛下載的鏡像,
? ? REPOSITORY???? ???????????????? TAG???? ???? IMAGE ID???? ???????? CREATED ???? ???? SIZE
????docker.io/docker/whalesay ? ?latest ? ? ? ? 6b362a9f73eb ???? 2 years ago ? ? ? ? 247 MB
? ??REPOSITORY : 鏡像的名字
? ???TAG : 鏡像的標簽,latest為缺省的標簽,當沒有設(shè)置標簽時,這個就是其標簽
? ? 在本地新建一個鏡像,以ysy/whalesay為其名字
? ??docker tag docker.io/docker/whalesay ysy/whalesay
????這時用docker images命令可以看到本地倉庫中已經(jīng)多了名字為ysy/whalesay 的鏡像
7.docker-compose多容器app
? ? docker-compose是一個獨立的宏娄,用于通過文本文件拉起多容器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)是獲取當前的這兩個命令的輸出逮壁,拼接到地址中孵坚,> 是指通過管道技術(shù),下載到后面的目錄中窥淆,成為可執(zhí)行文件
[root@localhost ~]# uname -s
Linux
[root@localhost ~]# uname -m
x86_64
? ? 7.2docker-compose實戰(zhàn)
? ? ? ? 7.2.1實戰(zhàn)項目架構(gòu)介紹
? ? ? ? 7.2.2實戰(zhàn)項目yaml配置文件
? ? ? ? 7.2.3項目實戰(zhàn)
? ? ? ? ? ? 在ghost中創(chuàng)建三個文件夾
? ?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"] : 這個是node.js的程序卖宠,使用npm命令啟動
? ? ? ? ? ? 在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
? ? ? ? ? ? ? ? 因為在ghost中已經(jīng)有啟動命令,所以這里就不在有啟動命令
? ? ? ? ? ? ? ? 在nginx文件夾中添加nginx.conf文件
worker processes 4;
events {worker connections 1024;}
http {
? ? ? ? server {
? ? ? ? ? ? ? ? listen 80;
? ? ? ? ? ? ? ? lacation / {
? ? ? ? ? ? ? ? ? ? ? ? proxy pass http://ghost-app:2368;
? ? ? ? ? ? ? ? }
? ? ? ? }
}
????????????????這里是使用ghost-app這個名字指向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ù)庫的路徑掛載到容器中祖乳,這樣寫的博客就會被存下來逗堵,不會隨著容器的消失而消失
????????????????將docker-compose拉起來
docker-compose up -d
????????????????這時候訪問 localhost:80,產(chǎn)生502錯誤秉氧,說明nginx已經(jīng)起來的眷昆,但是nginx和ghost之間鏈接有錯誤
????????????????將nginx.conf的變量名中的空格替換為下劃線
????????????????將docker-compose停掉
docker-compose stop
????????????????將停掉的容器刪除
docker-compose rm
????????????????再次將docker-compose拉起來的時候,需要使用build命令
docker-compose build
????????????????因為第一次將docker-compose拉起來的時候汁咏,docker-compose會自動幫我們build鏡像亚斋,但是第二次就不會了
????????????????然后再次使用?docker-compose up -d 命令將docker-compose拉起來
????????????????訪問locallhost:80就可以正常的看到nginx的歡迎頁面
????????????????這時訪問localhost/ghost路徑,就可以自動的跳轉(zhuǎn)到localhost/ghost/setup的路徑下面
????????????????這時表示我們的三個容器協(xié)作運行已經(jīng)是沒問題的了
????????????????本人的docker-compose沒有下載完成攘滩,暫未測試