程序:代碼,命令
進程:正在運行的程序
容器的系統文件就是宿主機的某一個目錄
html
區別:
kvm虛擬化: 須要硬件的支持,須要模擬硬件,能夠運行不一樣的操做系統,啓動時間分鐘級(開機啓動流程)
容器:共用宿主機內核,第一個進程直接啓動服務
優點:
容器:共用宿主機內核,輕量級,損耗少,啓動快,性能高,只能運行在linux系統上
虛擬機:須要硬件的支持,須要模擬硬件,須要走開機啓動流程,能夠運行不一樣的操做系統
linux
新建一個子系統(擁有本身完整的系統文件)nginx
https://linux.cn/article-8313-1.html
docker
linux container (namespaces:命名空間 隔離環境 及cgroups 進程資源限制)
cgroups 限制一個進程可以使用的資源。cpu,內存,硬盤io
json
docker是經過進程虛擬化技術(namespaces及cgroups cpu、內存、磁盤io等)來提供容器的資源隔離與安全保障等。因爲Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似虛擬機(VM)額外的操做系統開銷,提升資源利用率。
namespace:資源隔離
cgroups:進程的資源限制
配置源centos
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 配置docker源,改成從清華源下載 wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo yum install docker-ce -y
docker是傳統的CS架構分爲docker client和docker servertomcat
[root@docker01 ~]# docker version Client: Docker Engine - Community Version: 19.03.2 API version: 1.40 Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 05:28:55 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.2 API version: 1.40 (minimum version 1.12) Go version: go1.12.8 Git commit: 6a30dfc Built: Thu Aug 29 05:27:34 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc8 GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f docker-init: Version: 0.18.0 GitCommit: fec3683
docker主要組件有:鏡像、容器、倉庫, 網絡,存儲
啓動容器必須須要一個鏡像,倉庫存儲鏡像
啓動容器須要鏡像,倉庫存儲鏡像
安全
docker的主要目標是「Build,Ship and Run any App,Angwhere」,構建,運輸,到處運行
一次構建,到處運行bash
[root@docker01 ~]# docker run -d -p 80:80 nginx # run:建立並啓動一個容器 # -d: 放在後臺運行 # -p: 端口映射 # nginx: 鏡像名字
配置鏡像加速
[root@docker01 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } [root@docker01 ~]# systemctl restart docker
官方鏡像倉庫地址:hub.docker.com
image:鏡像
[root@docker01 ~]# docker image build import load prune push save history inspect ls pull rm tag ==================================================================================== docker search tomcat # 搜索鏡像 優先選擇官方鏡像,stars(星星)數量多的 docker pull alpine # 獲取alpine最新版 docker pull alpine:3.9 # 指定獲取alpine版本 docker push alpine # 上傳鏡像到倉庫 # 官方pull: docker pull centos:6.8(沒有指定版本,默認會下載最新版) # 私有倉庫pull: docker pull daocloud.io/huangzhichong/alpine-cn:latest # daocloud.io:域名 huangzhichong:用戶名 docker image ls # 查看鏡像列表 docker images # 查看鏡像列表 docker image rm alpine:3.9 # 刪除鏡像 能夠寫鏡像ID號 docker rmi alpine:3.9 # 刪除鏡像 docker image save nginx:latest -o docker_nginx.tar.gz # 導出鏡像 docker image load -i docker_alpine3.9.tar.gz # 導入鏡像 docker image import docker_alpine3.9.tar.gz # 導入鏡像,導入鏡像沒有名字 docker image inspect docker_alpine3.9.tar.gz # 查看鏡像屬性 docker image built -t # 構建鏡像 docker image history # 構建鏡像歷史 docker image prune # 清楚鏡像緩存
docker run -d -p 80:80 nginx # run:建立並啓動一個容器 # -d: 放在後臺運行 # -p: 端口映射 # nginx: 鏡像名字 # -v: 源地址(宿主機):目標地址(容器) docker restart infallible_hodgkin # 重啓容器 能夠寫容器名字或者容器ID docker start infallible_hodgkin # 啓動容器 docker stop infallible_hodgkin # 關閉容器 docker kill infallible_hodgkin # 殺死容器 docker ps # 默認查看運行的容器 docker ps -a # 查看全部狀態容器 docker ps -l # 查看最近建立的容器 docker ps -q # 只顯示鏡像id號 docker rm crazy_elgamal # 刪除容器 能夠寫容器名字和ID docker rm -f `docker ps -a -q` # 刪除全部容器 docker rm `docker ps -a -q` # 只刪除關閉的容器 docker container commit # 提交容器爲鏡像 docker container update # 容器性能進行限制 docker container update --memory 300MiB --memory-swap 3000MiB nging:latest docker container create # 建立容器不啓動 docker container export # 將容器提交爲tar.gz包 docker container logs # 查看容器歷史信息 docker container pause # 容器掛起 docker container unpause # 取消容器掛起 docker container cp # 將宿主機文件拷貝到容器目錄 docker container diff # 對比容器有哪些改變 docker run -it --name centos6 centos:6.9 /bin/bash # 建立啓動容器,並進入容器 # -it 配交互式的終端interactive tty # --name 指定容器的名字 # /bin/bash 覆蓋容器的初始命令 # 進入正在運行的容器的命令 方法1: 格式:docker exec [OPTIONS] CONTAINER COMMAND docker exec -it 容器id或容器名字 /bin/bash(/bin/sh) 例子:docker container exec -it centos6 /bin/bash 方法2:格式:docker attach [OPTIONS] CONTAINER 例子:docker attach 4bcf2984f4e7 ctrl+p,ctrl+q 退出
總結:
docker容器內的第一個進程(初始命令)必須一直處於前臺運行的狀態(必須夯住),不然這個容器,就會處於退出狀態!
業務在容器中運行:初始命令,夯住,啓動服務
nginx服務初始命令夯住:nginx -g 'daemon off;'
zabbix服務初始命令夯住:/usr/sbin/zabbix_agentd -f -c /etc/zabbix/zabbix_agentd.conf
指定映射(docker 會自動添加一條iptables規則來實現端口映射)
命令格式: -p hostPort:containerPort -p ip:hostPort:containerPort 多個容器都想使用8080端口 -p ip::containerPort(隨機端口) -p hostPort:containerPort/udp -p 10.0.0.100::53/udp 使用宿主機的10.0.0.100這個ip地址的隨機端口的udp協議映射容器的udp53端口 -p 81:80 –p 443:443 能夠指定多個-p 隨機映射:docker run -P(大P) (隨機端口) # hostPort:宿主機端口 containerPort:容器端口 命令示範: docker run -d -p 80:80 nginx:latest docker run -d -p 10.0.0.11:81:80 nginx:latest #多個容器都想使用81端口,改變IP地址便可實現 docker run -d -p 10.0.0.12:81:80 nginx:latest #多個容器都想使用81端口,改變IP地址便可實現 docker run -d -p 10.0.0.11::80 nginx:latest #宿主機隨機選用端口 docker run -d -p 10.0.0.11::80/udp nginx:latest # 更換udp協議,還能再用80端口 docker run -d -p 10.0.0.11:80:80 -p 443:443 nginx:latest #指定端口映射
數據卷(文件或目錄)
-v 卷名:/data (第一次卷是空,會將容器的數據複製到卷中,若是卷裏面有數據,把卷數據的掛載到容器中)
-v src(宿主機的目錄):dst(容器的目錄)
數據卷容器
-–volumes-from(跟某一個已經存在的容器掛載相同的卷)
數據卷命令 [root@docker01 ~]# docker volume create inspect ls prune rm ===================================================================================== docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest # xiaoniao:站點目錄 docker run -d -p 81:80 -v xiaoniao:/usr/share/nginx/html nginx:latest # xiaoniao爲數據卷:在宿主機上 目錄:/var/lib/docker/volumes/xiaoniao/_data/ # 數據卷沒有會自動建立 docker run -d -p 84:80 --volumes-from busy_greider nginx:latest # 跟某一個已經存在的容器掛載相同的卷
練習題:
基於nginx啓動一個容器,監聽80和81,訪問80,出現nginx默認歡迎首頁,訪問81,出現小鳥。
方法一
[root@docker01 _data]# docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/opt nginx:latest 194068a14505104e1886aac31bceed5fc631dd1c1e514f97d5cf38dfdc91532d [root@docker01 _data]# docker exec -it adoring_roentgen /bin/bash root@194068a14505:/# ls /opt/ 2000.png 21.js icon.png img index.html sound1.mp3 xiaoniaofeifei.zip root@194068a14505:/# cd /etc/nginx/conf.d/ root@194068a14505:/etc/nginx/conf.d# ls default.conf root@194068a14505:/etc/nginx/conf.d# echo 'server { > listen 81; > server_name localhost; > location / { > root /opt; > index index.html index.htm; > } > }' >xiaoniao.conf root@194068a14505:/etc/nginx/conf.d# exit exit [root@docker01 _data]# docker restart adoring_roentgen adoring_roentgen
方法二:
[root@docker01 opt]# echo 'server { > listen 81; > server_name localhost; > location / { > root /opt; > index index.html index.htm; > } > }' >xiaoniao.conf [root@docker01 opt]# ls containerd xiaoniao xiaoniao.conf [root@docker01 opt]# docker run -d -p 82:80 -p 83:81 -v /opt/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /opt/xiaoniao:/opt nginx:latest ad5180b890ed044d705ed240ed1845a6bbe2d6d86724676b0cc8d302daaa9f44