docker容器是另一個(gè)核心概念,容器是鏡像的一個(gè)運(yùn)行實(shí)例。不同的是鏡像是靜態(tài)的只讀文件,容器帶有運(yùn)行時(shí)需要的可寫層,并且容器中的應(yīng)用進(jìn)程處于運(yùn)行狀態(tài)。
虛擬機(jī)是模擬運(yùn)行一整套操作系統(tǒng),docker只運(yùn)行一個(gè)應(yīng)用和它的運(yùn)行環(huán)境。
成都創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元寶塔做網(wǎng)站,已為上家服務(wù),為寶塔各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
[root@docker01 ~]# docker create -it ubuntu:18.04
550c14d7db29b3fbcdff0819546403779f8ce717fa2a5012909b057c2f8b1806
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
550c14d7db29 ubuntu:18.04 "/bin/bash" 34 seconds ago Created kind_rosalind
[root@docker01 ~]# docker start 55
55
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
550c14d7db29 ubuntu:18.04 "/bin/bash" 2 minutes ago Up 5 seconds kind_rosalind
[root@docker01 ~]# docker run ubuntu:18.04 /bin/echo 'hello'
hello
當(dāng)執(zhí)行完/bin/echo 'hello'后,容器會(huì)自動(dòng)終止。
當(dāng)使用docker run來創(chuàng)建啟動(dòng)容器時(shí)會(huì)包含:
1、檢查本地是否存在指定鏡像,沒有就從公有倉庫下;
2、利用鏡像創(chuàng)建一個(gè)容易,并啟動(dòng);
3、分配一個(gè)文件系統(tǒng)給容器,并給只讀的鏡像外掛一個(gè)可讀寫層;
4、從宿主機(jī)的網(wǎng)橋接口橋接一個(gè)虛擬機(jī)口到容器中;
5、網(wǎng)橋地址池分配一個(gè)ip地址給容器;
6、執(zhí)行用戶應(yīng)用;
7、容器自動(dòng)終止
啟動(dòng)一個(gè)bash終端,允許用戶進(jìn)行交互
[root@docker01 ~]# docker run -it ubuntu:18.04 /bin/bash
root@4d99166324fb:/# pwd
/
root@4d99166324fb:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
-t:為docker分配一個(gè)為終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上
-i:讓容器的標(biāo)準(zhǔn)輸入保持打開
[root@docker01 ~]# docker run -d ubuntu:18.04 /bin/bash -c "while true;do echo 'hello';sleep 1;done"
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5d805944192 ubuntu:18.04 "/bin/sh -c 'while t…" 4 seconds ago Up 3 seconds frosty_joliot
[root@docker01 ~]# docker logs a5d805944192
hello
hello
hello
...
[root@docker01 ~]# docker run --name test --rm -it ubuntu bash
root@98eedc501dec:/#
另一個(gè)終端執(zhí)行,暫停
[root@docker01 ~]# docker pause test
test
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98eedc501dec ubuntu "bash" 2 minutes ago Up 2 minutes (Paused) test
恢復(fù)
[root@docker01 ~]# docker unpause test
test
[root@docker01 ~]# docker stop test
test
[root@docker01 ~]# docker restart test
test
如果需要進(jìn)入容器進(jìn)行操作,推薦使用官方的attach或exec命令。
attach的命令格式為:
docker attach [--detach-key[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
-detach-key[=[]] #指定退出attach模式的快捷鍵,默認(rèn)是CTRL+p CTRL+q;
--no-stdin=true|false #是否關(guān)閉標(biāo)準(zhǔn)輸入,默認(rèn)是保持打開;
--sig-proxy=treu|false #是否代理收到的系統(tǒng)信號(hào)給應(yīng)用程序,默認(rèn)打開;
[root@docker01 ~]# docker run -itd ubuntu:18.04
b82dba0090bcb85fafdeef03e67f9973426965f2792efae73de1c07eb0b44bc2
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b82dba0090bc ubuntu:18.04 "/bin/bash" 52 seconds ago Up 50 seconds fervent_maxwell
[root@docker01 ~]# docker attach fervent_maxwell
root@b82dba0090bc:/#
exec是1.3.0 docker版本后提供的一個(gè)更方便的工具,可以在運(yùn)行中容器內(nèi)直接執(zhí)行任何命令。
docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONAINER COMMAND [ARG...]
-d #在容器中后臺(tái)執(zhí)行命令
--detach-keys=“ ” #指定容器切回后臺(tái)的按鍵
-e #指定環(huán)境變量列表
-i #打開標(biāo)準(zhǔn)輸入接受用戶輸入命令,默認(rèn)為false
--privileged=treu|false #是否給執(zhí)行命令以最高權(quán)限,默認(rèn)false
-t #分配偽終端,默認(rèn)false
-u #執(zhí)行命令的用戶名或ID
[root@docker01 ~]# docker exec -it f2554976971b /bin/bash
root@f2554976971b:/# w
08:02:18 up 2 days, 18:58, 0 users, load average: 0.03, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root@f2554976971b:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:01 pts/0 00:00:00 /bin/bash
root 10 0 0 08:02 pts/1 00:00:00 /bin/bash
root 20 10 0 08:02 pts/1 00:00:00 ps -ef
此時(shí)會(huì)打開一個(gè)新的bash終端,不影響容器內(nèi)其他應(yīng)用的前提下,用戶與容器進(jìn)行交互。
可是使用docker [container] rm命令來刪除處于終止或退出狀態(tài)的容器。docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTIAINER
-f #是否強(qiáng)制終止并刪除一個(gè)運(yùn)行中的容器
-l #刪除容器的鏈接,但保留容器
-v #刪除容器掛載的數(shù)據(jù)卷
查看處于停止?fàn)顟B(tài)的容器,并刪除
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2554976971b ubuntu:18.04 "/bin/bash" 46 hours ago Up 46 hours focused_joliot
b82dba0090bc ubuntu:18.04 "/bin/bash" 47 hours ago Exited (0) 46 hours ago fervent_maxwell
[root@docker01 ~]# docker rm b82dba0090bc
b82dba0090bc
用于將容器從一個(gè)系統(tǒng)遷移到另外一個(gè)系統(tǒng),這時(shí)可以使用docker的導(dǎo)入和導(dǎo)出功能。
1、 導(dǎo)出容器是指,導(dǎo)出一個(gè)已經(jīng)創(chuàng)建的容器到一個(gè)文件,不管此時(shí)容器是否處于運(yùn)行狀態(tài)。docker [container] export [-o|--output[=""]] CONTAINER
-o #指定導(dǎo)出的tar文件名,也可以直接通過重定向來實(shí)現(xiàn)
[root@docker01 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2554976971b ubuntu:18.04 "/bin/bash" 47 hours ago Up 47 hours focused_joliot
a5d805944192 ubuntu:18.04 "/bin/sh -c 'while t…" 2 days ago Exited (137) 2 days ago frosty_joliot
[root@docker01 docker]# docker export a5d805944192 > test_ubuntu2.tar
[root@docker01 docker]# docker export -o test_ubuntu.tar a5d805944192
[root@docker01 docker]# ls
test_ubuntu2.tar test_ubuntu.tar
導(dǎo)出的文件可以使用docker [container] import 命令導(dǎo)入變成鏡像。docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL| -[REPOSITORY[:TAG]]
-c #再倒入的同時(shí)執(zhí)行對(duì)容器進(jìn)行修改的Dockerfile指令
[root@docker01 docker]# docker import test_ubuntu.tar test111/ubuntu:v1.0
sha256:6c5cd99408ca4648c4d3e5560280e75633e3fbcfdba2778d1b69e4353fb27cc9
[root@docker01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test111/ubuntu v1.0 6c5cd99408ca 13 seconds ago 64.2M
注:docker load和docker import區(qū)別在于容器快照(docker import)將丟棄所有的的歷史記錄和元數(shù)據(jù)信息,僅保存容器當(dāng)時(shí)的快照狀態(tài)。鏡像存儲(chǔ)文件(docker load)將保存完整記錄,體積更大。
1、查看容器詳情,docker container inspect [OPTIONS] ONTAINER
[root@docker01 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2554976971b ubuntu:18.04 "/bin/bash" 47 hours ago Up 47 hours focused_joliot
[root@docker01 docker]# docker container inspect frosty_joliot
[
{
"Id": "a5d8059441922d3157d2af1d0ab0a724acf13fbe8bb60ddb92fa2536620c2f84",
"Created": "2020-03-05T05:50:37.692124654Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo hello;sleep 1;done"
],
"State": {
"Status": "exited",
查看某個(gè)容器的具體信息,會(huì)以json格式返回包括ID、創(chuàng)建時(shí)間、路徑、狀態(tài)、鏡像、配置等在內(nèi)的各項(xiàng)信息。
2、查看容器內(nèi)的進(jìn)程,docker [container] top [OPTIONS] CONTAINER,類似于linux的top命令,包括PID、用戶、時(shí)間、命令等。必須是運(yùn)行狀態(tài)的容器才能查看
[root@docker01 docker]# docker top focused_joliot
UID PID PPID C STIME TTY TIME CMD
root 12365 12348 0 Mar05 pts/0 00:00:00 /bin/bash
root 12431 12348 0 Mar05 pts/1 00:00:00 /bin/bash
3、查看統(tǒng)計(jì)信息,docker [container] status [OPTIONS] [CONTAINER],會(huì)顯示CPU、內(nèi)存、存儲(chǔ)、網(wǎng)絡(luò)等使用情況的統(tǒng)計(jì)信息。
-a,--all #輸出所有容器統(tǒng)計(jì)信息,默認(rèn)僅在運(yùn)行中
-format string #格式化輸出信息
-no-stream #不持續(xù)輸出,默認(rèn)會(huì)自動(dòng)更新持續(xù)實(shí)時(shí)結(jié)果
-no-trunc #不截?cái)噍敵鲂畔?/p>
[root@docker01 docker]# docker stats focused_joliot
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f2554976971b focused_joliot 0.00% 824KiB / 15.51GiB 0.01% 648B / 0B 0B / 0B 2
1、復(fù)制文件
container cp支持在容器和主機(jī)之間復(fù)制文件,docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
-a,-archive #打包模式,復(fù)制文件會(huì)帶有原始的UID/GID信息
-L,-follow-link #跟隨軟鏈接,當(dāng)原路徑為軟鏈接時(shí),默認(rèn)只復(fù)制鏈接信息,使用該選項(xiàng)會(huì)復(fù)制鏈接的目標(biāo)內(nèi)容。
將本都路徑oglab/python復(fù)制到容器的/tmp路徑下
[root@docker01 oglab]# docker cp Python-3.8.2 focused_joliot:/tmp
2、查看變更
[root@docker01 oglab]# docker container diff focused_joliot
A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_streams.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_transports.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/__init__.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/echo.py
A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_queues.py
A /tmp/Python-3.8.2/Lib/test/test_distutils.py
A /tmp/Python-3.8.2/Lib/test/test_posixpath.py
A /tmp/Python-3.8.2/Lib/test/test_subclassinit.py
A /tmp/Python-3.8.2/Lib/test/xmltestdata
...
3、查看端口映射,container port命令可以查看容器的端口映射情況,docker container port CONTAINER [PRIVATE_PORT[/PROTO]]
[root@docker01 oglab]# docker container port focused_joliot
4、更新配置,container update命令可以更新容器的一些運(yùn)行時(shí)配置,主要是一些資源限制份額。docker [container] update [OPTIONS] CONTAINER
限制總配額為1秒,容器所占用的時(shí)間為10%,單位微妙
[root@docker01 oglab]# docker update --cpu-quota 1000000 f2554976971b
f2554976971b
[root@docker01 oglab]# docker update --cpu-period 1000000 f2554976971b
f2554976971b