Docker容器技術於2013年做爲開源Docker引擎推出。是一個開源的應用容器引擎,基於 Go 語言並聽從Apache2.0協議開源。基於 Linux 內置的 Namespace 和 CGroup 等系統內隔離機制而抽象出來的一種輕虛擬化技術。php
l 更快速的交付和部署:html
對開發和運維人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行 ,解決開發環境和生產環境不一致的問題。mysql
l 更輕鬆的遷移和擴展:linux
Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。 這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。nginx
l 更高的資源利用率(微服務)git
Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器github
1.單項目打包web
每次部署項目到測試、生產等環境,都要部署一大堆依賴的軟件、工具,並且部署期間出現問題概率很大,不經意就花費了很長時間。redis
Docker主要理念就是環境打包部署,可在任意DockerEngine運行。前期咱們只須要將每一個項目環境打包到鏡像,push到鏡像倉庫,當有須要部署這個項目時,直接pull鏡像啓動容器,這個項目就能夠訪問了!一次構建屢次部署,一勞永逸。sql
2.整套項目打包
有一個產品能夠整套部署到客戶那裏,以往都是派一名實施工程師到客戶那部署。若是用了Docker,咱們能夠前期將這套項目封裝打包起來,實現一鍵部署,分分鐘鍾搞定,就不須要再派人過去了。好比官方的DockerCompose編排工具。
3.新開源技術試用
直接從公共鏡像倉庫pull項目官方作好鏡像啓動容器
Docker將項目環境打包成鏡像,能夠在任何DockerEngine上浪。此時Docker就是咱們這些項目的基石,Docker可移植性,保持運行狀態一致性
一個項目版本快速迭代的測試場景,須要一個合理的CI(持續集成)/CD(持續部署)環境支撐。CI/CD是一個週期性自動化項目測試流程,包括構建、部署、測試、發佈等工做,不多須要人工干預。
儘量細粒度拆分業務程序架構,由多個獨立服務組成業務系統。一個容器一個服務,容器之間相互隔離
容器集羣化管理已經有成熟的解決方案,好比:官方的Swarm,谷歌的K8S
虛擬機(Virtual Machine)指經過軟件模擬的具備完整硬件系統功能的、運行在一個徹底隔離環境中的完整計算機系統。在實體計算機中可以完成的工做在虛擬機中都可以實現。在計算機中建立虛擬機時,須要將實體機的部分硬盤和內存容量做爲虛擬機的硬盤和內存容量。每一個虛擬機都有獨立的CMOS、硬盤和操做系統,能夠像使用實體機同樣對虛擬機進行操做。
Vm管理系統 Hyper-V、Xen以及KVM
https://docs.microsoft.com/zh...
Docker架構設計圖
鏡像(Image)
Docker 鏡像(Image)就是一個只讀的模板。例如:一個鏡像能夠包含一個完整的操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。鏡像能夠用來建立 Docker 容器,一個鏡像能夠建立不少容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。
容器(Container)
Docker 利用容器(Container)來運行應用。容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的。
文件系統隔離技術使得Docker成爲了一個很是有潛力的虛擬化技術。在容器中能夠對文件進行修改、刪除、建立。
倉庫(Registry)
倉庫(Repository)是集中存放鏡像文件的場所。倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。
官方倉庫地址:https://hub.docker.com
https://docs.docker.com/docke...
systemctl stop firewalld
獲取selinux狀態
[root@instance-xkxy07le ~]# getenforce Disabled
關閉selinux
vim /etc/selinux/config SELINUX=disabled
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@instance-xkxy07le ~]# yum list docker-ce --showduplicates | sort -r Loaded plugins: langpacks, versionlock Installed Packages Excluding 1 update due to versionlock (use "yum versionlock status" to show it) docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.4-3.el7 @docker-ce-stable docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
1. 默認安裝最新版本
yum install docker-ce
2. 安裝指定版本
yum install docker-ce-3:18.09.5-3.el7
systemctl start docker
https://cr.console.aliyun.com...
[root@instance-xkxy07le ~]# docker container --hlep unknown flag: --hlep See 'docker container --help'. Usage: docker container COMMAND Manage containers Commands: attach Attach local standard input, output, and error streams to a running container commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem exec Run a command in a running container export Export a container's filesystem as a tar archive inspect Display detailed information on one or more containers kill Kill one or more running containers logs Fetch the logs of a container ls List containers pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container prune Remove all stopped containers rename Rename a container restart Restart one or more containers rm Remove one or more containers run Run a command in a new container start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codes Run 'docker container COMMAND --help' for more information on a command.
docker search redis
docker pull redis
docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE redis latest de25a81a5a0b 2 weeks ago 98.2MB
docker image rm redis
docker image save de25a81a5a0b -o redis.tar
docker image load -i redis.tar
docker image tag IMAGEID REPOSITORY:VERSION
docker image prune
docker image build
docker inspect
[root@instance-xkxy07le ~]# docker image --help Usage: docker image COMMAND Manage images Commands: build Build an image from a Dockerfile history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Display detailed information on one or more images load Load an image from a tar archive or STDIN ls List images prune Remove unused images pull Pull an image or a repository from a registry push Push an image or a repository to a registry rm Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
[root@instance-xkxy07le ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54e39c3af532 redis:latest "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:6379->6379/tcp amazing_sinoussi docker container ps
-a :顯示全部的容器,包括未運行的。
-f :根據條件過濾顯示的內容。
--format :指定返回值的模板文件。
-l :顯示最近建立的容器。
-n :列出最近建立的n個容器。
--no-trunc :不截斷輸出。
-q :靜默模式,只顯示容器編號。
-s :顯示總的文件大小。
輸出詳情介紹:
CONTAINER ID:容器 ID。
IMAGE:使用的鏡像。
COMMAND:啓動容器時運行的命令。
CREATED:容器的建立時間。
STATUS:容器狀態。
狀態有7種:
1.created(已建立)
2.restarting(重啓中)
3.running(運行中)
4.removing(遷移中)
5.paused(暫停)
6.exited(中止)
7.dead(死亡)
[root@instance-xkxy07le ~]# docker run -p 6379:6379 -d redis:latest redis-server 54e39c3af532dc183204381a86f41ae3b7f18c754a8d5abae1f911aa83b92cea
-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權重,在CPU共享場景使用
-e, --env=[], 指定環境變量,容器中可使用該環境變量
-m, --memory="", 指定容器的內存上限
-P, --publish-all=false, 指定容器暴露的端口
-p, --publish=[], 指定容器暴露的端口
-h, --hostname="", 指定容器的主機名
-v, --volume=[], 給容器掛載存儲卷,掛載到容器的某個目錄
--volumes-from=[], 給容器掛載其餘容器上的卷,掛載到容器的某個目錄
--cap-add=[], 添加權限,權限清單詳見: https://linux.die.net/man/7/c...
--cap-drop=[], 刪除權限,權限清單詳見: https://linux.die.net/man/7/c...
--cidfile="", 運行容器後,在指定文件中寫入容器PID值,一種典型的監控系統用法
--cpuset="", 設置容器可使用哪些CPU,此參數能夠用來容器獨佔CPU
--device=[], 添加主機設備給容器,至關於設備直通
--dns=[], 指定容器的dns服務器
--dns-search=[], 指定容器的dns搜索域名,寫入到容器的/etc/resolv.conf文件
--entrypoint="", 覆蓋image的入口點
--env-file=[], 指定環境變量文件,文件格式爲每行一個環境變量
--expose=[], 指定容器暴露的端口,即修改鏡像的暴露端口
--link=[], 指定容器間的關聯,使用其餘容器的IP、env等信息
--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc時使用
--name="", 指定容器名字,後續能夠經過名字進行容器管理,links特性須要使用名字
--net="bridge", 容器網絡設置:
1.bridge 使用docker daemon指定的網橋
2.host //容器使用主機的網絡
3.container:NAME_or_ID >//使用其餘容器的網路,共享IP和PORT等網絡資源
4.none 容器使用本身的網絡(相似--net=bridge),可是不進行配置
--privileged=false, 指定容器是否爲特權容器,特權容器擁有全部的capabilities
--restart="no", 指定容器中止後的重啓策略:
1.no:容器退出時不重啓
2.on-failure:容器故障退出(返回值非零)時重啓
3.always:容器退出時老是重啓
--rm=false, 指定容器中止後自動刪除容器(不支持以docker run -d啓動的容器)
--sig-proxy=true, 設置由代理接受並處理信號,可是SIGCHLD、SIGSTOP和SIGKILL不能被代理
[root@instance-xkxy07le ~]# docker exec -it 容器名/容器id /bin/bash root@54e39c3af532:/data# hostname 54e39c3af532
docker logs 容器名
docker stats 容器名
--no-stream
docker inspect 容器名/容器id
docker cp php.ini 容器名/容器id:/
docker top 容器名/容器
docker stop/start/restart 容器名/容器
docker rm 容器名/容器
docker rm -f $(docker ps -a | awk '{print $1}')
docker update 容器名/容器
–blkio-weight Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
–cpu-period Limit CPU CFS (Completely Fair Scheduler) period
–cpu-quota Limit CPU CFS (Completely Fair Scheduler) quota
–cpu-rt-period Limit the CPU real-time period in microseconds
–cpu-rt-runtime ALimit the CPU real-time runtime in microseconds
–cpu-shares , -c CPU shares (relative weight)
–cpus Number of CPUs
–cpuset-cpus CPUs in which to allow execution (0-3, 0,1)
–cpuset-mems MEMs in which to allow execution (0-3, 0,1)
–kernel-memory Kernel memory limit
–memory , -m Memory limit
–memory-reservation Memory soft limit
–memory-swap Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap
–restart Restart policy to apply when a container exits
將宿主機目錄掛載到容器目錄。
數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,能夠提供不少有用的特性:
數據卷 能夠在容器之間共享和重用
對 數據卷 的修改會立馬生效
對 數據卷 的更新,不會影響鏡像
數據卷 默認會一直存在,即便容器被刪除
[root@instance-xkxy07le ~]# docker volume Usage: docker volume COMMAND Manage volumes Commands: create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumes Run 'docker volume COMMAND --help' for more information on a command.
docker volume create my-vol
docker volume ls
docker volume inspect my-vol
docker volume rm my-vol
docker volume prune
docker inspect web
docker run -d --name nginxweb -p 80:80 -v /home/www:/usr/share/nginx/html nginx
容器不會得到一個獨立的network namespace,而是與宿主機共用一個
獲取獨立的network namespace,但不爲容器進行任何網絡配置。
與指定的容器使用同一個network namespace,網卡配置也都是相同的。
自定義網橋,默認與bridge網絡同樣。
先建立一個docker0的網橋,使用veth pair建立一對虛擬網卡,一端放到新建立的容器中,並重命名eth0,另外一端放到宿主機上,以veth+隨機7個字符串命名,並將這個網絡設備加入到docker0網橋中,網橋自動爲容器分配一個IP,並設置docker0的IP爲容器默認網關。因此容器默認網絡都加入了這個網橋,所以均可以彼此通訊。同時在iptables添加SNAT轉換網絡段IP,以便容器訪問外網。
Linux IP信息包過濾原理
Docker主要經過netfilter/iptables實現網絡通訊。iptables由netfilter和iptables組成,netfilter組件是Linux內核集成的信息包過濾系統,它維護一個信息包過濾表,這個表用於控制信息包過濾處理的規則集。而iptables只是一個在用戶空間的工具,用於增刪改查這個過濾表的規則。
容器訪問外部
iptables -t nat -nL
外部訪問容器
iptables -t nat -nL
臨時生效:
# 網橋名稱 br_name=br0 # 添加網橋 brctl addbr $br_name # 給網橋設置IP ip addr add 192.168.1.120/24 dev $br_name # 刪除已存在的eth0網卡配置 ip addr del 192.168.1.120/24 dev eth0 # 激活網橋 ip link set $br_name up # 添加eth0到網橋 brctl addif $br_name eth0 還須要在Docker啓動時橋接這個網橋: vi /etc/default/docker DOCKER_OPTS="-b=br0" service docker restart
永久生效
# vi /etc/network/interfaces auto eth0 iface eth0 inet static auto br0 iface br0 inet static address 192.168.1.120 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 bridge_ports eth0
C_ID=$(docker run -itd --net=none ubuntu) C_PID=$(docker inspect -f '{{.State.Pid}}' $C_ID) # 建立network namespace目錄並將容器的network namespace軟鏈接到此目錄,以便ip netns命令讀取 mkdir -p /var/run/netns ln -s /proc/$C_PID/ns/net /var/run/netns/$C_PID # 添加虛擬網卡veth+容器PID,類型是veth pair,名稱是vp+容器PID ip link add veth$C_PID type veth peer name vp$C_PID # 添加虛擬網卡到br0網橋 brctl addif br0 veth$C_PID # 激活虛擬網卡 ip link set veth$C_PID up # 設置容器網絡信息 IP='192.168.1.123/24' GW='192.168.1.1' # 給進程配置一個network namespace ip link set vp$C_PID netns $C_PID # 在容器進程裏面設置網卡信息 ip netns exec $C_PID ip link set dev vp$C_PID name eth0 ip netns exec $C_PID ip link set eth0 up ip netns exec $C_PID ip addr add $IP dev eth0 ip netns exec $C_PID ip route add default via 192.168.1.1
一鍵腳本
https://github.com/jpetazzo/p...
# docker run -itd --name test01 centos:6 # docker attach test01 /# yum install openssh-server /# passwd root # docker commit test01 centos6_ssh # docker run -itd --name test03 -p 2222:22 centos6_ssh
指令 | 描述 |
---|---|
FROM | 構建的新鏡像是基於哪一個鏡像 例如:FROM centos:6 |
MAINTAINER | 鏡像維護者姓名或郵箱地址 例如:MAINTAINER wangzhiqiang |
RUN | 構建鏡像時運行的Shell命令 例如: RUN [「yum」, 「install」, 「httpd」] RUN yum install httpd |
CMD | 運行容器時執行的Shell命令 例如: CMD [「-c」, 「/start.sh」] CMD ["/usr/sbin/sshd", "-D"] CMD /usr/sbin/sshd –D |
EXPOSE | 聲明容器運行的服務端口 例如:EXPOSE 80 443 |
ENV | 設置容器內環境變量 例如:ENV MYSQL_ROOT_PASSWORD 123456 |
ADD | 拷貝文件或目錄到鏡像,若是是URL或壓縮包會自動下載或自動解 壓 ADD … ADD [「」,… 「」] ADD https://xxx.com/html.tar.gz /var/www/html ADD html.tar.gz /var/www/html |
COPY | 拷貝文件或目錄到鏡像,用法同上 例如:COPY ./start.sh /start.sh |
ENTRYPOINT | 運行容器時執行的Shell命令 例如: ENTRYPOINT [「/bin/bash", 「-c", 「/start.sh"] ENTRYPOINT /bin/bash -c ‘/start.sh’ |
VOLUME | 指定容器掛載點到宿主機自動生成的目錄或其餘容器 例如: VOLUME ["/var/lib/mysql"] |
USER | 爲RUN、CMD和ENTRYPOINT執行命令指定運行用戶 USER [:] or USER [:] 例如:USER wangzhiqiang |
WORKDIR | 爲RUN、CMD、ENTRYPOINT、COPY和ADD設置工做目錄 例如:WORKDIR /data |
HEALTHCHECK | 健康檢查 HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ |
ARG | 在構建鏡像時指定一些參數 例如: FROM centos:6 ARG user # ARG user=root USER $user # docker build --build-arg user=wangzhiqiang Dockerfile . |
CMD和ENTRYPOINT指令區別
使用Dockerfile文件構建鏡像
Usage: docker build [OPTIONS] PATH | URL | - Options: -t, --tag list # 鏡像名稱 -f, --file string # 指定Dockerfile文件位置
一、註冊帳號 https://hub.docker.com 二、登陸Docker Hub # docker login 或 # docker login --username=lizhenliang --password=123456 三、鏡像打標籤 # docker tag wordpress:v1 lizhenliang/wordpress:v1 四、上傳 # docker push lizhenliang/wordpress:v1 搜索測試: # docker search lizhenliang 五、下載 # docker pull lizhenliang/wordpress:v1
Docker Hub做爲Docker默認官方公共鏡像;若是想本身搭建私有鏡像倉庫,官方也提供registry鏡像,使得搭建私有倉 庫很是簡單。
下載registry鏡像並啓動 # docker pull registry # docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry 測試,查看鏡像倉庫中全部鏡像 # curl http://192.168.1.120:5000/v2/_catalog {"repositories":[]} 配置私有倉庫可信任 # vi /etc/docker/daemon.json {"insecure-registries":["192.168.1.120:5000"]} # service docker restart 打標籤 # docker tag centos:6 192.168.1.120:5000/centos:6 上傳 # docker push 192.168.1.120:5000/centos:6 下載 # docker pull 192.168.1.120:5000/centos:6 列出鏡像標籤 # curl http://192.168.1.120:5000/v2/centos/tags/list
本文做者:王志強
若是文章有錯誤或者建議,請在評論區指出,很是感謝~