container.jpg
原文鏈接
需要注意的是在Docker里面竞滓,鏡像和容器是兩個(gè)概念钠龙,鏡像類似操作系統(tǒng)的ISO稠鼻,而容器則是以該ISO為基礎(chǔ)生成而來的端三。
系統(tǒng)相關(guān)
boot2docker默認(rèn)用戶名是docker搔驼,密碼是tcuser
鏡像和容器
docker pull ubuntu:14.04.1 # 拉取官方鏡像
docker pull registry.hub.docker.com/ubuntu:14.04 # 拉取特定網(wǎng)站的鏡像
docker pull index.alauda.cn/library/centos:centos6.6 # 靈雀云的鏡像,鏡像中心https://hub.alauda.cn/
docker images # 列出所有的鏡像
docker ps # 列出正在運(yùn)行的容器
docker ps -a -s # 列出所有容器,-s可以列出大小信息
docker ps -q # 只列出容器的ID
docker rm # 刪除容器
docker rmi # 刪除鏡像
docker tag id name:tag # 給鏡像更改名稱
創(chuàng)建容器
啟動(dòng)參數(shù)
--add-host="host:IP" # 給hosts添加一行
-d # 使容器在后臺運(yùn)行(detached mode)
--name haofly # 給容器命名
--net=host # 網(wǎng)絡(luò)模式茶没,host表示容器不會(huì)獲得獨(dú)立的Network Namspace肌幽,而是和宿主機(jī)公用一個(gè)Network Namespace晚碾。容器將不會(huì)虛擬網(wǎng)卡,配置自己的IP牍颈,而是使用宿主機(jī)器的IP和端口迄薄;none表示沒有網(wǎng)絡(luò)琅关;bridge是docker默認(rèn)的網(wǎng)絡(luò)設(shè)置煮岁;container:NAME_or_ID表示container模式,指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace涣易,和指定的容器共享IP画机、端口范圍等。
--restart=no # 容器的重啟模式新症,no表示不自動(dòng)重啟步氏,on-failure表示當(dāng)容器推出碼為非零的時(shí)候自動(dòng)重啟,always表示總是自動(dòng)重啟徒爹,docker重啟后也會(huì)自動(dòng)重啟荚醒,unless-stopped表示只有在docker重啟時(shí)不重啟,其他時(shí)候都自動(dòng)重啟隆嗅。
-v /etc/test/:/etc/internal/test # 將宿主機(jī)的/etc/test目錄掛載到容器內(nèi)部的/etc/internal/test目錄
啟動(dòng)命令
# docker run命令用于從鏡像創(chuàng)建一個(gè)容器
# -i參數(shù)表示將STDIN持續(xù)打開而不管是否已經(jīng)attached
docker run -t -i ubuntu:14.04.1 # 從ubuntu:14.04.1鏡像創(chuàng)建一個(gè)容器
docker run -t -i ubuntu:14.04.1 /bin/bash # 從ubuntu:14.04.1創(chuàng)建容器并在容器中執(zhí)行命令
docker run -t -i -d ubuntu:14.04.1 # 創(chuàng)建容器并作為daemon運(yùn)行
docker run -t -i -p 80:80 ubuntu:14.04.1 # 創(chuàng)建容器并映射容器的80端口到主機(jī)的80端口
docker run -t -i -v /etc/hehe/:/etc/haha ubuntu:14.04.1 # 創(chuàng)建容器并映射主機(jī)的/etc/hehe目錄到容器的/etc/haha目錄
docker run -t -i
exit # 退出容器
docker logs 容器名稱 # 獲取容器的輸出信息界阁,但是通過docker exec進(jìn)入容器的時(shí)候,其標(biāo)準(zhǔn)輸出并未被主進(jìn)程相關(guān)聯(lián)胖喳,所以docker exec所執(zhí)行進(jìn)程的標(biāo)準(zhǔn)輸出不會(huì)進(jìn)入容器的日志文件泡躯。即docker容器的日志只負(fù)責(zé)應(yīng)用本身的標(biāo)準(zhǔn)輸出,不包括docker exec衍生進(jìn)程的標(biāo)準(zhǔn)輸出(http://docs.daocloud.io/allen-docker/docker-exec)
docker run -t -i -d -p 80:80 -v /home/haofly/docker/test/mysite:/mysite django-apache:latest # 我當(dāng)前機(jī)器上的一條執(zhí)行自己創(chuàng)建的鏡像的命令
?
容器操作
docker start:和docker run后面參數(shù)一樣丽焊,只是它是重啟容器较剃,而docker run是創(chuàng)建容器
docker stop 容器名/ID:停止某個(gè)容器
docker attach 容器名/ID:直接進(jìn)入容器,查看容器當(dāng)前的標(biāo)準(zhǔn)輸出
docker exec -it 容器名 bash # ssh進(jìn)一個(gè)容器
docker inspect 容器名:查看一個(gè)容器的詳細(xì)信息
Dockerfile
Dockerfile是一個(gè)制作鏡像的腳本工具技健,通過它可以比直接拷貝docker容器更方便地遷移写穴,只需要拷貝一個(gè)Dockerfile然后在本地構(gòu)建一個(gè)即可。
docker build -t local:mine .
Dockerfile的語法說明:
#: Dockerfile中用#來進(jìn)行注釋
FROM: 指定基于哪個(gè)鏡像創(chuàng)建,這樣會(huì)先pull該鏡像.例如`FROM ubuntu:14.04.1`
MAINTAINER: 指定創(chuàng)建作者的信息.例如`MAINTAINER haofly <haoflynet@gmail.com>`
ADD: 將指定的主機(jī)目錄中的文件代替要構(gòu)建的鏡像中的文件,這條命令通常用于鏡像源的更換,例如`ADD sources.list_aliyun /etc/apt/sources.list`,這樣,鏡像中的/etc/apt/sources.list文件就被sources.list_aliyun文件替代了
RUN: 執(zhí)行一條shell命令
EXPOSE: 暴露什么端口給主機(jī),需要注意的是,即使指定了,也得在docker run的時(shí)候通過-p參數(shù)執(zhí)行端口的映射
WORKDIR: 切換工作目錄,這樣下面的CMD等就可以在新的目錄執(zhí)行
CMD: 一般寫于最后,因?yàn)樗侨萜鲉?dòng)時(shí)才執(zhí)行的命令,并且無論寫多少,都只執(zhí)行最后那一條,一般用于容器中鏡像的啟動(dòng),例如`CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]`,當(dāng)然,也可不加括號和引號,直接用shell的方式寫一條命令.但是如果docker run 中指定了命令過后,CMD將不被執(zhí)行
ENTRYPOINT: 和CMD類似,但是如果docker run中指定了命令,它仍然會(huì)被執(zhí)行
ENV: 指定環(huán)境變量
ARG: 指定參數(shù)雌贱,比如ockerfile里面定義了`ARG JAVA_HOME`啊送,那么可以在構(gòu)建的時(shí)候用docker build JAVA_HOME=$JAVA_HOME對該參數(shù)進(jìn)行賦值
ONBUILD: 后面跟的是其他的普通指令,例如ONBUILDI RUN mkdir test帽芽,實(shí)際上它是創(chuàng)建了一個(gè)模版景象删掀,后續(xù)根據(jù)該景象創(chuàng)建的子鏡像不用重復(fù)寫它后面的指令,就會(huì)執(zhí)行該指令了
Docker Compose
Docker Compose主要用于快速在集群中部署分布式應(yīng)用导街,主要有兩個(gè)概念:
- 服務(wù)(Service): 一個(gè)應(yīng)用的容器披泪,實(shí)際上可以包括若干個(gè)運(yùn)行相同鏡像的容器實(shí)例
- 項(xiàng)目(Project): 由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元
一個(gè)例子:
weba: # 給容器取名
build: ./web # 如果容器需要使用特定的Dockerfile可以在這里指定
expose: # 暴露的接口
- 80
webb: # 第二個(gè)容器
build: ./web
extra_hosts:
- "haofly.net:172.0.0.1" # 添加hosts
command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" # 如果要在開機(jī)之后執(zhí)行命令可以這樣子做
expose:
- 80
haproxy: # 第三方容器
image: haproxy:latest # 直接從鏡像啟動(dòng),而不是Dockerfile啟動(dòng)
volumes: # 掛載的卷
- ./haproxy:/haproxy-override
links: # 連接另外的容器
- weba
- webb:test.haofly.net # 分配一個(gè)別名搬瑰,都能ping通的
- webc
ports: # 映射的端口
- "80:80"
expose: # 暴露的端口
- "80"
docker-compose常用命令
docker-compose stop # 暫停所有容器
docker-compose up -d # start所有的容器
docker-compose rm -f # 刪除所有容器
docker-compose ps # 列出所有的容器
遷移
docker save -o ubuntu_14.04.tar ubuntu:14.04 # 導(dǎo)出鏡像到本地
docker load < ubuntu_14.04.tar # 加載本地鏡像
docker export 容器ID > ubuntu.tar # 導(dǎo)出容器快照到本地
docker import # 導(dǎo)入本地快照
docker commit -m "說明信息" -a "用戶信息" # 更改容器后直接將容器作為鏡像
# 如果要將本地鏡像推送到目標(biāo)倉庫款票,這樣做
docker login hub.haofly.net # 先登錄
docker tab image_id hub.haofly.net/haofly/test:tag # 更改名稱
docker push hub.haofly.net/haofly/test:tag # 推送
常用容器/鏡像
Alpine
是一個(gè)非常簡單的鏡像控硼,本身只有幾兆,包含了linux最簡單的內(nèi)核艾少,并且功能十分強(qiáng)大卡乾。很多的基礎(chǔ)鏡像都是基于它。當(dāng)然缚够,有一點(diǎn)特別注意幔妨,它沒有自帶apt-get,也沒有bash(sh代替)谍椅。不過還好误堡,也能使用阿里的鏡像源。這里有它里面的一些基本操作
apk add --update # 更新源
apt add --no-cache python # 安裝軟件
apt del python # 刪除軟件
MySQL/Mariadb容器
docker run --name some-mariadb -v /Users/haofly/workspace/share:/share --net host -e MYSQL_ROOT_PASSWORD=mysql -d mariadb:tag # 開啟一個(gè)mysql容器雏吭,可通過exec bash進(jìn)入容器內(nèi)
PHP容器
docker run --name php-apache -v /Users/haofly/workspace/share/yangqing:/var/www/html -p 80:80 --link some-mysql:mysql -d b664eb500b48 # 這是php-apache锁施,并且連接mysql容器,如果要安裝mysql擴(kuò)展需要在Dockerfile里面去安裝
CentOS容器
docker run -it -v /Users/haofly/workspace/dbm:/share --name dbm -d index.alauda.cn/library/centos:centos6.6 /bin/bash
docker run -it -v /Users/haofly/workspace/share:/share --name salt_client --privileged 750109855bc0 /usr/sbin/init # 對于7.x,如果想在容器里執(zhí)行systemctl杖们,需要添加privileged參數(shù)悉抵,并且后面應(yīng)該用init
NodeJS容器
docker run -it -v /Users/haofly/workspace:/workspace -p 4000:4000 -p 4001:4001 --name node -d node:latest /bin/bash
Nginx代理
太好用了,這個(gè)
# 首先摘完,直接拉下這個(gè)鏡像并創(chuàng)建容器
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro --name nginx-proxy jwilder/nginx-proxy:latest
docker run -it -e VIRTUAL_HOST=dev.haofly.net --name dev -d eboraas/laravel # 通過-e VIRTUAL_HOST指定域名姥饰,然后把該域名加到hosts里面127.0.0.1 dev.haofly.net,即可訪問了描焰,連nginx的配置都不用改