一、docker容器概念
docker 容器就是一個虛擬操作系統,只不過只運行在用戶空間而已。
二、容器運行
2.1.docker run 運行參數說明
docker run :創建一個新的容器並運行一個命令
常用參數如下: -a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項; -d: 後臺運行容器,並返回容器ID; -i: 以交互模式運行容器,通常與 -t 同時使用; -p: 端口映射,格式爲:主機(宿主)端口:容器端口 -t: 爲容器重新分配一個僞輸入終端,通常與 -i 同時使用; --name="nginx-lb": 爲容器指定一個名稱; --dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 設置環境變量; --env-file=[]: 從指定文件讀入環境變量; --cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運行; -m :設置容器使用內存最大值; --net="bridge": 指定容器的網絡連接類型,支持 bridge/host/none/container: 四種類型; --link=[]: 添加鏈接到另一個容器; --expose=[]: 開放一個端口或一組端口;
2.2.運行第一個container
2.2.1.交互式運行,並啓動一個sh終端
# docker run -it busybox /bin/sh / # / # / # ls bin dev etc home proc root sys tmp usr var / # / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever / # / # exit
2.3.容器進程
2.3.1.守護進程運行一個容器
# docker run -d --name="ckl-nginx" nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx a5a6f2f73cd8: Pull complete 1ba02017c4b2: Pull complete 33b176c904de: Pull complete Digest: sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba Status: Downloaded newer image for nginx:latest 4dc24b453a4a60bd5978adee4495f3e98304dcc05ae8f605e6bd160848973c5d
運行過程說明:
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
利用鏡像創建並啓動一個容器
分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個 ip 地址給容器
執行用戶指定的應用程序
執行完畢後容器被終止
2.3.2.查看容器進程
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4dc24b453a4a nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp ckl-nginx
容器已經運行,容器啓動端口80,而非本地端口
2.3.3.查看容器詳細信息獲取IP
# docker inspect 4dc24b453a4a [ { .... "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02" .... } }
2.3.4.容器如何與本地主機如何通信
查看本地IP
# ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:58ff:fedb:c79b prefixlen 64 scopeid 0x20<link> ether 02:42:58:db:c7:9b txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 656 (656.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到,有一個docker0的網絡接口
訪問nginx容器:
# curl http://172.17.0.2 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1>
2.3.5.查看所有容器進程
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4dc24b453a4a nginx "nginx -g 'daemon of…" 30 minutes ago Up 30 minutes 80/tcp ckl-nginx 3f8af7094f31 busybox "/bin/sh" 34 minutes ago Exited (0) 34 minutes ago keen_leavitt
可以看出,之前的busybox容器是退出狀態
2.3.6.停止容器
# docker stop 4dc24b453a4a
查看進程:
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4dc24b453a4a nginx "nginx -g 'daemon of…" 35 minutes ago Exited (0) 1 second ago ckl-nginx 3f8af7094f31 busybox "/bin/sh" 39 minutes ago Exited (0) 39 minutes ago keen_leavitt
停止的容器狀態爲Exited
2.3.7.啓動一個存在的容器
# docker start 3f8af7094f31
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f8af7094f31 busybox "/bin/sh" 40 minutes ago Up 4 seconds keen_leavitt
2.3.8.重啓容器
# docker restart 4dc24b453a4a
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4dc24b453a4a nginx "nginx -g 'daemon of…" 40 minutes ago Up 10 seconds 80/tcp ckl-nginx 3f8af7094f31 busybox "/bin/sh" 43 minutes ago Up 3 minutes keen_leavitt
三、docker進入容器
容器啓動後,如何進入容器?
3.1.進入方法一
# docker attach 3f8af7094f31 / # / # / # ls bin dev etc home proc root sys tmp usr var / # exit
3.2.進入方法二
# docker exec -it 3f8af7094f31 /bin/sh / # / # / # ls bin dev etc home proc root sys tmp usr var / # / # exit
四、刪除容器
4.1.刪除運行的容器
# docker rm 4dc24b453a4a Error response from daemon: You cannot remove a running container 4dc24b453a4a60bd5978adee4495f3e98304dcc05ae8f605e6bd160848973c5d. Stop the container before attempting removal or force remove
容器在運行,無法刪除,需要先停止
# docker stop 4dc24b453a4a # docker rm 4dc24b453a4a
4.2.刪除所有退出狀態的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
4.3.刪除所有容器
docker rm $(docker ps -a -q)