Docker三劍客(Machine Compose Swarm)
容器技術充分利用操作系統(tǒng)本身已有的機制和特性,可以實現(xiàn)遠超傳統(tǒng)虛擬機的輕量級虛擬化。
容器有效地將由單個操作系統(tǒng)管理的資 源劃分到孤立的組中,以更好地孤立的組之間平衡有沖突的資 源使用需求。
優(yōu)勢:
1、快速分發(fā)和部署
2、一次創(chuàng)建或配置任意地方使用
3、更簡單的更新管理
1、docker安裝
yum install docker
2、docker常用命令
獲取鏡像 docker pull image
搜索鏡像 docker search image
運行鏡像 docker run image
添加標簽 docker tag image:tag myimage:tag
查看詳情 docker inspect image
查看歷史 docker history image
排除以某一類容器
docker ps |grep -v cname
刪除鏡像 docker rmi image
存出鏡像 docker save [image ID]
殺死所有正在運行的容器
docker kill $(docker ps -a -q)
刪除所有已經(jīng)停止的容器
docker rm $(docker ps -a -q)
刪除所有以dev-開頭的容器
docker rm docker ps --filter "name=dev-*" -a -q
強制刪除所有鏡像
docker rmi -f $(docker images -q)
強制刪除所有以dev開頭的鏡像
docker rmi -f $(docker images dev-* -q)
docker清除所有容器:
docker rm -f (sudo docker ps -qa)
docker save -o ubuntu_14.04.tar ubuntu:14.04
載入鏡像 docker load [image.tar]
docker load --input ubuntu_14.04.tar
進行容器
sudo docker exec -it 容器id /bin/bash
3、docker鏡像
創(chuàng)建鏡像有三種方式:基于已有鏡像的容器創(chuàng)建、基于本地模板導入、基于Dockerfile創(chuàng)建
1、基于已有鏡像的容器創(chuàng)建 docker commit
docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
2、基于本地模板導入 使用命令docker import,要直接導入一個鏡像可以使有和OpenVZ提供的模板來創(chuàng)建。
cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
鏡像自身是只讀的。容器從鏡像啟動的時候會在鏡像的最上層創(chuàng)建一個可寫層
使用公有鏡像
docker pull 鏡像名字
構(gòu)建自用鏡像
docker commit 容器id
4、docker容器
容器是鏡像的一個運行實例
創(chuàng)建容器 docker create [image ID] -it可交互式容器,使用docker create命令新建的容器處理停止狀態(tài),可以使用docker start命令啟動
-d, --detach=false, 指定容器運行于前臺還是后臺,默認為false
-i, --interactive=false, 打開STDIN,用于控制臺交互
-t, --tty=false, 分配tty設備,該可以支持終端登錄,默認為false
-u, --user="", 指定容器的用戶
-a, --attach=[], 登錄容器(必須是以docker run -d啟動的容器)
-w, --workdir="", 指定容器的工作目錄
-c, --cpu-shares=0, 設置容器CPU權(quán)重,在CPU共享場景使用
-e, --env=[], 指定環(huán)境變量,容器中可以使用該環(huán)境變量
-m, --memory="", 指定容器的內(nèi)存上限
-P, --publish-all=false, 指定容器暴露的端口
-p, --publish=[], 指定容器暴露的端口
-h, --hostname="", 指定容器的主機名
-v, --volume=[], 給容器掛載存儲卷,掛載到容器的某個目錄
--volumes-from=[], 給容器掛載其他容器上的卷,掛載到容器的某個目錄
--cap-add=[], 添加權(quán)限,權(quán)限清單詳見:http://linux.die.net/man/7/capabilities
--cap-drop=[], 刪除權(quán)限,權(quán)限清單詳見:http://linux.die.net/man/7/capabilities
--cidfile="", 運行容器后,在指定文件中寫入容器PID值,一種典型的監(jiān)控系統(tǒng)用法
--cpuset="", 設置容器可以使用哪些CPU,此參數(shù)可以用來容器獨占CPU
--device=[], 添加主機設備給容器,相當于設備直通
--dns=[], 指定容器的dns服務器
--dns-search=[], 指定容器的dns搜索域名,寫入到容器的/etc/resolv.conf文件
--entrypoint="", 覆蓋image的入口點
--env-file=[], 指定環(huán)境變量文件,文件格式為每行一個環(huán)境變量
--expose=[], 指定容器暴露的端口,即修改鏡像的暴露端口
--link=[], 指定容器間的關聯(lián),使用其他容器的IP、env等信息
--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc時使用
--name="", 指定容器名字,后續(xù)可以通過名字進行容器管理,links特性需要使用名字
--net="bridge", 容器網(wǎng)絡設置:
bridge 使用docker daemon指定的網(wǎng)橋
host //容器使用主機的網(wǎng)絡
container:NAME_or_ID >//使用其他容器的網(wǎng)路,共享IP和PORT等網(wǎng)絡資源
none 容器使用自己的網(wǎng)絡(類似--net=bridge),但是不進行配置
--privileged=false, 指定容器是否為特權(quán)容器,特權(quán)容器擁有所有的capabilities
--restart="no", 指定容器停止后的重啟策略:
no:容器退出時不重啟
on-failure:容器故障退出(返回值非零)時重啟
always:容器退出時總是重啟
--rm=false, 指定容器停止后自動刪除容器(不支持以docker run -d啟動的容器)
--sig-proxy=true, 設置由代理接受并處理信號,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
啟動容器 docker start
創(chuàng)建并啟動容器 docker run
查看日志 docker logs
停止容器 docker stop
進入容器:1、docker attach 容器id,2、docker exec -it 容器id /bin/bash,3、nsenter工具
刪除容器 docker rm 容器id
導出容器 docker export
docker export -o test_for_run.tar ce554267d7a4
導入容器 docker import
docker import test_for_run.tar - test/ubuntu:v1.0
既可以使用docker load命令來導入鏡像存儲文件到本地鏡像庫,也可以使用docker import命令來導入一個容器快照到本地鏡像庫,區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息,而鏡像存儲文件將保存完整記錄,體積也更大。從容器快照文件導入時可以重新指定標簽等元數(shù)據(jù)信息。
5、docker倉庫
Docker倉庫分為公開倉庫和私有倉庫,私有倉庫鏡像可通過push命令上傳到公有倉庫
創(chuàng)建私有倉庫,安裝docker后,可以通地管方提供的registry像像來簡單搭建一套本地私有倉庫環(huán)境
docker run -d -p 5000:5000 registry
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
#上傳鏡像到私有倉庫
docker push ip:5000/test
6、docker數(shù)據(jù)管理
1、數(shù)據(jù)卷(Data Volumes):容器內(nèi)數(shù)據(jù)直接映射到本地主機環(huán)境;
2、數(shù)據(jù)卷容器(Data Volume Containers):使用特定容器維護數(shù)據(jù)卷。
在用docker run 命令的時候,使用- v 標記可以在容器內(nèi)創(chuàng)建一個數(shù)據(jù)卷。多次重復使用-v 標記可以創(chuàng)建多個數(shù)據(jù)卷。
如果用戶需要在多個容器之間共享一些持續(xù)更新的數(shù)據(jù),最簡單的方式是使用數(shù)據(jù)卷容器。
docker run -it --volumes-from dbdata --name db1 ubuntu
如果刪除了掛載的容器(包括dbdata、db1和db2),數(shù)據(jù)卷并不會被自動刪除。如果要刪除一個數(shù)據(jù)卷,必須在刪除最后一個還掛載著它的容器時顯式使用 docker rm-v 命令來指定同時刪除關聯(lián)的容器。
可以利用數(shù)據(jù)卷容器對其中的數(shù)據(jù)卷進行備份、恢復,以實現(xiàn)數(shù)據(jù)的遷移。
1、備份
docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
解釋:worker 容器啟動后,使用了 tar cvf/backup/backup.tar/dbdata命令來將/dbdata 下內(nèi)容備份為容器內(nèi)的/ backup/ backup.tar,即宿主主機當前目錄下的backup.tar。
2、恢復
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
解釋:創(chuàng)建另一個新的容器,掛載 dbdata2的容器,并使用untar 解壓備份文件到所掛載的容器卷中
7、端口映射容器互聯(lián)
當容器中運行一些網(wǎng)絡應用,要讓外部訪問這些應用時,可以通過- P或-p 參數(shù)來指定端口映射。當使用-P(大寫的)標記時,Docker會隨機映射一個49000~49900 的端口到內(nèi)部容器開放的網(wǎng)絡端口。
#隨機映射
docker run -d -P training/webapp python app.py
#映射所有接口地址
docker run -d -p 5000:5000 training/webapp python app.py
#映射到指定地址的指定端口
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
#映射到指定地址的任意端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
#使用 udp 標記來指定 udp端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
#查看映射端口配置
docker port nostalgic_morse 5000
#容器有自己的內(nèi)部網(wǎng)絡和 IP地址,使用docker inspect+容器ID 可以獲取容器的具體信息
容器的互聯(lián)(linking)是一種讓多個容器中應用進行快速交互的方式。連接系統(tǒng)依據(jù)容器的名稱來執(zhí)行。因此,首先需要定義一個好記的容器名字。
使用--link 參數(shù)可以讓容器之間安全地進行交互。
docker run -d -P --name web --link db:db training/webapp python app.py
Docker 相當于在兩個互聯(lián)的容器之間創(chuàng)建了一個虛機通道,而且不用映射它們的端口到宿主主機上。
使用env 命令來查看 web 容器的環(huán)境變量
docker run --rm --name web2 --link db:db training/webapp env
8、dockerfile
一開始必須指明所基于的鏡像名稱,接下來一般是說明維護者信息。后面則是鏡像操作指令,例如 RUN 指令,RUN指令將對鏡像執(zhí)行跟隨的命令。每運行一條RUN 指令,鏡像就添加新的一層,并提交。最后是 CMD指令,用來指定運行容器時的操作命令。
FROM 指定所創(chuàng)建鏡像的基礎鏡像
NAUBTAUBER 指定維護者信息
RUN 運行命令
CMD 指定啟動容器時默認執(zhí)行的命令
LABEI 指定生成鏡像的元數(shù)據(jù)標簽信息
EXPOSE 聲明鏡像內(nèi)服務所監(jiān)聽的端口
ENV 指定環(huán)境變量
ADD 復制指定的<src>路徑下的內(nèi)容到容器中的<dest>路徑下,<src>可以為URL;如果為tar文件會自動解壓到<dest>路徑下
COPY 復制本地方機的<src>路徑下的內(nèi)容到鏡像中的<dcst>路徑下,一般情況下推薦使用COPY,而不是ADD
ENTRYPOINT 指定鏡像的默認入口
VOLUME 創(chuàng)建數(shù)據(jù)卷掛載點
USER 指定運行容器時的用戶名或UID
WORKDIR 配置工作目錄
ARG 指定鏡像內(nèi)使用的參數(shù)(例如版本號信息等)
ONGUILD 配置當前創(chuàng)建的鏡像作為其他鏡像的基礎鏡像時,所執(zhí)行的創(chuàng)建操作指令
STOPSIGNAL 容器退出時的信號值
HEALTHCHECK 如何進行健康檢查
SHELL 指定使用shell時的默認shell類型
任何Dockerfile 中的第一條指令必須為 FROM指令。并且,如果在同一個Dockerfile 中創(chuàng)建多個鏡像,可以使用多個 FROM 指令(每個鏡像一次)。
#nginx Dockerfile編寫
# base image
FROM centos
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.15.8.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.15.8
WORKDIR /usr/local/src/nginx-1.15.8
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
EXPOSE 80
#構(gòu)建鏡像
sudo docker build -t nginx:v1 .
創(chuàng)建springboot 應用鏡像
# Docker image for springboot file run
# VERSION 0.0.1
# Author: pibigstar
# 基礎鏡像使用java
FROM primetoninc/jdk:1.8
# 作者
MAINTAINER pibigstar <741047261@qq.com>
# VOLUME 指定了臨時文件目錄為/tmp。
# 其效果是在主機 /var/lib/docker 目錄下創(chuàng)建了一個臨時文件,并鏈接到容器的/tmp
VOLUME /tmp
# 將jar包添加到容器中并更名為app.jar
ADD docker-test.jar app.jar
# 運行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
構(gòu)建鏡像
sudo docker build -t springboot-demo .
運行指定鏡像
sudo docker run -d -p 8081:8080 springboot-demo
9、docker-compose
1、linux安裝
> sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
> sudo chmod +x /usr/local/bin/docker-compose
> sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2、docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: your-mysql-root-password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wp_site:/var/www/html
ports:
- "80:80"
- "443:443"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
wp_site:
spark:docker-compose.yml
version: '3'
services:
master:
image: sequenceiq/spark:1.4.0
hostname: master
ports:
- "4040:4040"
- "8042:8042"
- "7077:7077"
- "8088:8088"
- "8080:8080"
restart: always
deploy:
resources:
limits:
cpus: '0.50'
memory: '1024M'
reservations :
cpus: '0.25'
memory: '256M'
command: bash /usr/local/spark/sbin/start-master.sh && ping localhost > /dev/null
worker:
image: sequenceiq/spark:1.4.0
links:
- master:master
expose:
- "8081"
restart: always
command: bash /usr/local/spark/sbin/start-slave.sh spark://master:7077 && ping localhost > /dev/null
SpringBoot+mysql:docker-compose.yml
version: '2'
services:
#tomcat容器
app1:
#定義主機名
hostname: my_app
#使用的鏡像
image: webapp:latest
#容器的映射端口
ports:
- 8080:10010
#定義IP網(wǎng)絡
links:
- "pd:pg_server"
- "mysql:mysql_server"
#mysql容器
mysql:
#定義主機名
hostname: my_mysql
#使用的鏡像
image: my_mysql:latest
#定義掛載點
volumes:
- ./mysql/data:/var/lib/mysql
#定義mysql字符utf8
command: --character-set-server=utf8
#定義環(huán)境變量,mysql里密碼,用戶,數(shù)據(jù)庫
environment:
MYSQL_ROOT_PASSWORD: bysjhhrl2019
sudo docker-compose up -d