centos7 docker删除端口映射_容器Docker详解
| 特性 | 容器 | 虛擬機 |
| 啟動速度 | 秒級 | 分鐘級 |
| 硬盤使用 | 一般為MB | 一般為GB |
| 性能 | 接近原生 | 弱于原生 |
| 系統支持量 | 單機支持上千個容器 | 一般幾十個 |
| 隔離性 | 安全隔離 | 完全隔離 |
| Docker | 面向對象 |
| 容器 | 對象 |
| 鏡像 | 類 |
Namespace,容器隔離的基礎,保證A容器看不到B容器,6個名空間:User、Mnt、Network、UTS、IPC、Pid
CGroups,容器資源統計和隔離。主要用到的CGroups子系統:CPU、blkio、Device、freezer、memory
UnionFS,典型:AUFS/OverlayFS,分層鏡像實現的基礎
Docker Client客戶端——>向Docker服務器進程發起請求,如:創建、停止、銷毀容器等操作
Docker Server服務器進程—–>處理所有Docker的請求,管理所有容器
Docker Registry鏡像倉庫——>鏡像存放的中央倉庫,可看作是存放二進制的scm
yum install docker -y ? ? ? ? ?#安裝
systemctl start docker ? ? ? ? #啟動 ? ?
systemctl enable docker ? ? ? ?#設置開機自啟動
基本命令docker search centos ? #搜索鏡像
默認從國外拉去,速度很慢,可以使用DaoCloud配置加速。curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://d6f11267.m.daocloud.io
腳本是寫入
echo "{\"registry-mirrors\": [\"http://d6f11267.m.daocloud.io\"]}"> /etc/docker/daemon.json
systemctl restart docker ? ? ? ? ? ? ?#重啟失效
根據需求拉取鏡像:docker pull docker.io/ansible/centos7-ansible
拉去search到的全部鏡像:for i in `docker search centos|awk '!/NAME/{print $2}'`;do docker pull $i;done
查看本地鏡像:docker images
命令整理容器操作:docker create # 創建一個容器但是不啟動它
docker run # 創建并啟動一個容器
docker stop # 停止容器運行,發送信號SIGTERM
docker start # 啟動一個停止狀態的容器
docker restart # 重啟一個容器
docker rm # 刪除一個容器
docker kill # 發送信號給容器,默認SIGKILL
docker attach # 連接(進入)到一個正在運行的容器
docker wait # 阻塞一個容器,直到容器停止運行
獲取容器信息:docker ps # 顯示狀態為運行(Up)的容器
docker ps -a # 顯示所有容器,包括運行中(Up)的和退出的(Exited)
docker inspect # 深入容器內部獲取容器所有信息
docker logs # 查看容器的日志(stdout/stderr)
docker events # 得到docker服務器的實時的事件
docker port # 顯示容器的端口映射
docker top # 顯示容器的進程信息
docker diff # 顯示容器文件系統的前后變化
導出容器:docker cp # 從容器里向外拷貝文件或目錄
docker export # 將容器整個文件系統導出為一個tar包,不帶layers、tag等信息
執行:docker exec # 在容器里執行一個命令,可以執行bash進入交互式
鏡像操作:docker images # 顯示本地所有的鏡像列表
docker import # 從一個tar包創建一個鏡像,往往和export結合使用
docker build # 使用Dockerfile創建鏡像(推薦)
docker commit # 從容器創建鏡像
docker rmi # 刪除一個鏡像
docker load # 從一個tar包創建一個鏡像,和save配合使用
docker save # 將一個鏡像保存為一個tar包,帶layers和tag信息
docker history # 顯示生成一個鏡像的歷史命令
docker tag # 為鏡像起一個別名
鏡像倉庫(Registry)操作:docker login # 登錄到一個registry
docker search # 從registry倉庫搜索鏡像
docker pull # 從倉庫下載鏡像到本地
docker push # 將一個鏡像push到registry倉庫中
簡單實踐操作運行并進入容器操作:docker run -i -t docker.io/1832990/centos6.5 ?/bin/bash
-t 表示在新容器內指定一個偽終端或終端;-i 表示允許我們對容器內的(STDIN)進行交互;-d 表示將容器在后臺運行;/bin/bash,這將在容器內啟動 bash shell;所以當容器(container)啟動之后,我們會獲取到一個命令提示符:?在容器內我們安裝MySQL并設置開機自啟動,將修改后的鏡像提交:docker ps -l 查詢容器ID
docker commit -m "功能" -a "用戶信息" ID tag 提交修改后的鏡像
docker inspect ID 查看詳細信息
docker push ID 上傳docker鏡像
利用DockerFile創建鏡像使用命令docker build , 需要創建一個Dockerfile文件,其中包含一組指令來告訴Docker如何構建鏡像。mkdir DockerFile
cd DockerFile
cat > Dockerfile <<EOF
FROM 603dd3515fcc
MAINTAINER Docker xuel
RUN yum install mysql mysql-server -y
RUN mddir /etc/sysconfig/network
RUN /etc/init.d/mysqld start
EOF
docker build -t "centos6.8:mysqld" .
-t 制定repository與tag. 指定Dockerfile的路徑注意一個鏡像不能超過127層此外,還可以利用ADD命令復制本地文件到鏡像;用EXPOSE命令來向外部開放端口;用CMD命令來描述容器啟動后運行的程序等。CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]Dockerfile詳解Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為注釋,每一行只支持一條指令,每條指令可以攜帶多個參數。Dockerfile的指令根據作用可以分為兩種,構建指令和設置指令。構建指令:用于構建image,其指定的操作不會在運行image的容器上執行;設置指令:用于設置image的屬性,其指定的操作將在運行image的容器中執行。FROM(指定基礎image)構建指令,必須指定且需要在Dockerfile其他指令的前面。后續的指令都依賴于該指令指定的image。FROM指令指定的基礎image可以是官方遠程倉庫中的,也可以位于本地倉庫。該指令有兩種格式:FROM ? ? ? ? ? ? ? ? ?#指定基礎image為該image的最后修改的版本
FROM :<tag> ? ? ? ? ? ? ?#指定基礎image為該image的一個tag版本。
MAINTAINER(用來指定鏡像創建者信息)構建指令,用于將image的制作者相關的信息寫入到image中。當我們對該image執行docker inspect命令時,輸出中有相應的字段記錄該信息。MAINTAINER
RUN(安裝軟件用)構建指令,RUN可以運行任何被基礎image支持的命令。如基礎image選擇了Ubuntu,那么軟件管理部分只能使用Ubuntu的命令。RUN (the command is run in a shell - `/bin/sh -c`) ?
RUN ["executable", "param1", "param2" ... ] ?(exec form)
CMD(設置container啟動時執行的操作)設置指令,用于container啟動時指定的操作。該操作可以是執行自定義腳本,也可以是執行系統命令。該指令只能在文件中存在一次,如果有多個,則只執行最后一條。CMD ["executable","param1","param2"] (like an exec, this is the preferred form) ?
CMD command param1 param2 (as a shell)
ENTRYPOINT指定的是一個可執行的腳本或者程序的路徑,該指定的腳本或者程序將會以param1和param2作為參數執行。所以如果CMD指令使用上面的形式,那么Dockerfile中必須要有配套的ENTRYPOINT。當Dockerfile指定了ENTRYPOINT,那么使用下面的格式:CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
ENTRYPOINT(設置container啟動時執行的操作)設置指令,指定容器啟動時執行的命令,可以多次設置,但是只有最后一個有效。ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form) ?
ENTRYPOINT command param1 param2 (as a shell)
該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。當獨自使用時,如果你還使用了CMD命令且CMD是一個完整的可執行的命令,那么CMD指令和ENTRYPOINT會互相覆蓋只有最后一個CMD或者ENTRYPOINT有效。# CMD指令將不會被執行,只有ENTRYPOINT指令被執行 ?
CMD echo “Hello, World!” ?
ENTRYPOINT ls -l
另一種用法和CMD指令配合使用來指定ENTRYPOINT的默認參數,這時CMD指令不是一個完整的可執行命令,僅僅是參數部分;ENTRYPOINT指令只能使用JSON方式指定執行命令,而不能指定參數。FROM ubuntu ?
CMD ["-l"] ?
ENTRYPOINT ["/usr/bin/ls"]
USER(設置container容器的用戶)設置指令,設置啟動容器的用戶,默認是root用戶。# 指定memcached的運行用戶 ?
ENTRYPOINT ["memcached"] ?
USER daemon ?
或 ?
ENTRYPOINT ["memcached", "-u", "daemon"]
EXPOSE(指定容器需要映射到宿主機器的端口)設置指令,該指令會將容器中的端口映射成宿主機器中的某個端口。當你需要訪問容器的時候,可以不是用容器的IP地址而是使用宿主機器的IP地址和映射后的端口。要完成整個操作需要兩個步驟,首先在Dockerfile使用EXPOSE設置需要映射的容器端口,然后在運行容器的時候指定-p選項加上EXPOSE設置的端口,這樣EXPOSE設置的端口號會被隨機映射成宿主機器中的一個端口號。也可以指定需要映射到宿主機器的那個端口,這時要確保宿主機器上的端口號沒有被使用。EXPOSE指令可以一次設置多個端口號,相應的運行容器的時候,可以配套的多次使用-p選項。# 映射一個端口 ?
EXPOSE port1 ?
# 相應的運行容器使用的命令 ?(主機(宿主)端口:容器端口)
docker run -p port1 image ?
# 映射多個端口 ?
EXPOSE port1 port2 port3 ?
# 相應的運行容器使用的命令 ?
docker run -p port1 -p port2 -p port3 image ?
# 還可以指定需要映射到宿主機器上的某個端口號 ?
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
端口映射是Docker比較重要的一個功能,原因在于我們每次運行容器的時候容器的IP地址不能指定而是在橋接網卡的地址范圍內隨機生成的。宿主機器的IP地址是固定的,我們可以將容器的端口的映射到宿主機器上的一個端口,免去每次訪問容器中的某個服務時都要查看容器的IP的地址。對于一個運行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID來查看該端口號在宿主機器上的映射端口。ENV(用于設置環境變量)構建指令,在image中設置一個環境變量。ENV
設置了后,后續的RUN命令都可以使用,container啟動后,可以通過docker inspect查看這個環境變量,也可以通過在docker run --env key=value時設置或修改環境變量。假如你安裝了Java程序,需要設置JAVA_HOME,那么可以在Dockerfile中這樣寫:ENV JAVA_HOME /path/to/java/dirent
ADD(從src復制文件到container的dest路徑)構建指令,所有拷貝到container中的文件和文件夾權限為0755,uid和gid為0;如果是一個目錄,那么會將該目錄下的所有文件添加到container中,不包括目錄;如果文件是可識別的壓縮格式,則docker會幫忙解壓縮(注意壓縮格式);如果是文件且中不使用斜杠結束,則會將視為文件,的內容會寫入;如果是文件且中使用斜杠結束,則會文件拷貝到目錄下。ADD
是相對被構建的源目錄的相對路徑,可以是文件或目錄的路徑,也可以是一個遠程的文件url;是container中的絕對路徑。VOLUME(指定掛載點)設置指令,使容器中的一個目錄具有持久化存儲數據的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉后,所有的更改都會丟失。當容器中的應用有持久化數據的需求時可以在Dockerfile中使用該指令。FROM base ?
VOLUME ["/tmp/data"]
WORKDIR(切換目錄)設置指令,可以多次切換(相當于CD命令),對RUN、CMD、ENTRYPOINT生效。# 在 /p1/p2 下執行 vim a.txt ?
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
鏡像導入導出導出鏡像到本地:?docker save -o centos6.5.tar centos6.5 或
docker export f9c99092063c >centos6.5.tar
從本地將鏡像導入:docker load --input centos6.5.tar 或 ?
docker load < centos6.5.tar
docker rm刪除已經終止的容器
docker -f rm 可以刪除正在運行的容器
修改已經運行的后臺容器:docker exec -it CONTAINER ID /bin/bash
存儲數據盤Docker的鏡像使用一層一層文件組成的,Docker的一些存儲引擎可以處理怎么樣存儲這些文件。docker inspect centos ? ? ? ? ? ?#查看容器詳細信息
信息下方的Layers,就是CentOS的文件,這些東西都是只讀的不能去修改,我們基于這個鏡像去創建的鏡像和容器也會共享這些文件層,而Docker會在這些層上面去添加一個可讀寫的文件層。如果需要修改一些文件層里面的東西的話,Docker會復制一份到這個可讀寫的文件層里面,如果刪除容器的話,那么也會刪除它對應的可讀寫的文件層的文件。如果有些數據你想一直保存的話,比如:Web服務器上面的日志,數據庫管理系統里面的數據,那么我們可以把這些數據放到data volumes數據盤里面。它上面的數據,即使把容器刪掉,也還是會永久保留。創建容器的時候,我們可以去指定數據盤。其實就是去指定一個特定的目錄。docker run -i -t -v /mnt ?--name nginx docker.io/nginx /bin/bash
-v:制定掛載到容器內的目錄。?使用docker inspect容器ID可以查看掛載目錄對應于宿主機的物理文件路徑。?同樣,我們可以使用將制定物理宿主機的目錄掛載到容器的制定目錄下:將宿主機目錄掛載到容器內:docker run -d -p 80:80 --name nginx -v /webdata/wordpress:/usr/share/nginx/html docker.io/sergeyzh/centos6-nginx
-d 后臺運行--name 給運行的容器命名-v 宿主機目錄:容器目錄 將宿主機目錄掛載在容器內-p 宿主機端口:容器監聽端口 將容器內應用監聽端口映射到物理宿主機的特定端口上?映射多個物理目錄:(多寫幾個-v即可)?數據容器可以創建一個數據容器,也就是再創建容器是指定這個容器的數據盤,然后讓其他容器可以使用這個容器作為他們的數據盤,有點像繼承了這個數據容器指定的數據盤作為數據盤。首先創建一個數據容器命名為newnginx。docker create -v /mnt -it --name newnginx docker.io/nginx /bin/bash
利用此數據容器容器運行一個容器nginx1,在數據目錄/mnt下創建一個文件。docker run --volumes-from newnginx --name nginx1 -it docker.io/nginx /bin/bash
利用數據容器在創建一個容器nginx2,查看數據目錄下容器nginx1創建的文件依舊存在,同理在nginx2的/mnt下創建文件,其他基于數據容器運行的新容器也可以看到文件。?數據盤管理在刪除容器時,Docker默認不會刪除其數據盤。docker volume ls ? ? ? ? ? ? ? ? ? ?#查看數據盤
docker volume ls -f dangling=true ? ? ? ?#查看未被容器使用的數據盤
docker volume rm VOLUME NAME ? ? ? ?#刪除數據盤
如果想要刪除容器時,同時刪除掉其數據盤,那么可以使用-v參數。docker rm -v newnginx
網絡Docker提供幾種網絡,它決定容器之間和外界和容器之間如何去相互通信。docker network ls ? ? ? ?#查看網絡
當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。從docker0子網中分配一個IP給容器使用,并設置docker0的IP地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair設備,Docker將veth pair設備的一端放在新創建的容器中,并命名為eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,并將這個網絡設備加入到docker0網橋中。Bridge橋接網絡除非創建容器的時候指定網絡,不然容器就會默認的使用橋接網絡。屬于這個網絡的容器之間可以相互通信,不過外界想要訪問到這個網絡的容器呢,需使用橋接網絡,有點像主機和容器之間的一座橋,對容器有一點隔離作用。實際是在iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL查看。Host主機網絡如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。只用這種網絡的容器會使用主機的網絡,這種網絡對外界是完全開放的,能夠訪問到主機,就能訪問到容器。使用None模式Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。使用此種網絡的容器會完全隔離。簡單演示啟動兩個容器,查看其容器內部IP地址:for i in `docker ps |grep -v "CONTAINER"|awk '{print $1}'`;do docker inspect $i|grep 'IPAddress';done
查看橋接模式下主機內部容器之間和容器與宿主機直接均可正常通訊:?docker inspect 容器ID
查看host創建的容器內部沒有IP地址,它使用的為宿主機的地址:docker run -d --net host docker.io/sergeyzh/centos6-nginx
查看host創建的容器內部沒有IP地址,它使用的為宿主機的地址:docker run -d --net none docker.io/sergeyzh/centos6-nginx
容器端口如果想讓外界可以訪問到,基于bridge網絡創建的容器提供的服務,那你可以告訴Docker你要使用哪些接口。如果想查看鏡像會使用哪些端口,ExposedPorts,可以獲悉鏡像使用哪些端口。docker run -d -p 80 docker.io/sergeyzh/centos6-nginx ? ? ? ?
docker port 09648b2ff7f6
-p 參數會在宿主機隨機映射一個高端口到容器內的指定端口。?docker run -d -p 80:80 docker.io/sergeyzh/centos6-nginx ? ?#將宿主機的80端口映射到容器的80端口
原文鏈接:https://juejin.im/post/5c491406e51d4518c1551fd6Kubernetes實戰培訓Kubernetes實戰培訓將于2019年3月8日在深圳開課,3天時間帶你系統掌握Kubernetes,學習效果不好可以繼續學習。本次培訓包括:云原生介紹、微服務;Docker基礎、Docker工作原理、鏡像、網絡、存儲、數據卷、安全;Kubernetes架構、核心組件、常用對象、網絡、存儲、認證、服務發現、調度和服務質量保證、日志、監控、告警、Helm、實踐案例等。總結
以上是生活随笔為你收集整理的centos7 docker删除端口映射_容器Docker详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 得子宫内膜异位症能怀孕吗
- 下一篇: dnf求朋友们推荐几个后期刷图BT的职业