容器(containe)是鏡像的運行時實例.
容器
如果鏡像是一個模版,那么容器(containe)就是鏡像的運行時實例.
為什么要使用容器
與傳統(tǒng)的虛擬機相比,容器有如下優(yōu)勢
- 容器共享主機的資源, 更加輕巧.
- 容器可以根據(jù)需要加載必需的庫、依賴項和文件.
- 容器可以更好在生產(chǎn)環(huán)境進(jìn)行遷移.
啟動容器
使用docker run -option image:tag command命令 command參數(shù)來啟動一個容器, 如:
docker run -it mysql /bin/echo hello world!
上述命令會啟動一個容器并輸出

option可選列表如下
-
-d容器在后臺以domain模式運行,返回容器id -
-i以交互模式運行 通常與-t一起使用 -
-P容器內(nèi)部端口隨機映射到主機端口 -
-p指定端口映射 格式 主機端口:容器端口 -
-t: 為容器重新分配一個偽輸入終端m,通常與-i同時使用-it一起使用可以將當(dāng)前終端連接到容器終端 -
--name="newname""為容器指定一個名稱 -
--dns指定容器DNS,默認(rèn)與宿主一致 -
--dns-search example.com指定容器DNS搜索域名,默認(rèn)和宿主一致 -
-h指定容器的hostname -
-e key=value設(shè)置環(huán)境變量 -
--env-file=[]從指定文件讀取環(huán)境變量 -
--cpuset="0-2" or --cpuset="0,1,2"綁定容器到指定CPU運行 -
-m設(shè)定容器最大內(nèi)存 -
--net="bridge"指定容器的網(wǎng)絡(luò)連接類型,支持bridge/host/none/container四種類型 -
--link=[]添加鏈接到另一個容器 -
--expose=[]開放一個端口或一組端口 -
--volume,-v綁定一個卷
與容器交互
使用-it參數(shù)可以啟動一個偽終端
docker run -it test:v1

容器后臺運行
容器會在執(zhí)行完成command或者退出bash后終止,使用-d參數(shù)可以指定容器后臺運行,此處用mysql鏡像啟動一個容器
docker run -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
成功啟動后會返回這個容器的id
防止容器退出
docker容器同時只能管理一個進(jìn)程,如果這個進(jìn)程退出那么容器也就退出了.例子
docker run -it --name test1 centos:latest /bin/sh
啟動一個名為test1的centos鏡像,然后輸出exit并回車,然后docker ps -a發(fā)現(xiàn)這個容器已經(jīng)退出
628d9bded677 centos:latest "/bin/sh" 7 seconds ago Exited (0) 4 seconds ago test1
exit命令結(jié)束了docker管理的/bin/sh進(jìn)程,因而無論是否這個容器中有沒有其他進(jìn)程在后臺運行,容器都會退出.
換句話說,docker run指定的容器啟動時運行的程序結(jié)束,那么容器就會退出.
如何避免呢,可以在執(zhí)行上述命令后,按CTRL+P+Q切出,此時容器并不會退出.
docker run -it --name test1 centos:latest /bin/sh
然后按CTRL+P+Q切出,再查看.
b30c4510a76c centos:latest "/bin/sh" 1 minutes ago Up 1 minutes test1
查看容器運行狀態(tài)
使用docker ps或者docker container ls命令查看運行狀態(tài),與linux的ps 命令非常相似

這里docker ps的命令包括:
-
-a列出所有容器 -
-l列出最新創(chuàng)建容器 -
-n=2列出最近創(chuàng)建的2個容器 -
-q僅列出容器ID -
-s顯示容器大小
如果要查看所有容器,使用docker ps -a

查款容器日志
使用docker logs container_id|name命令來查看容器日志.
容器重命名
在創(chuàng)建一個容器的時候,docker后自動對其進(jìn)行重命名,也可以使用--name來指定,以mysql為例
docker run -e MYSQL_ROOT_PASSWORD=123456 --name mysql_server -d mysql:5.6

登陸到容器
-d指定容器后臺運行后,可以使用兩種方式登陸到容器.
-
docker attach container_id不推薦,退出會導(dǎo)致容器停止運行. -
docker exec推薦
docker exec -it mysql_server /bin/bash

檢視容器
使用docker inspect container_id|container_name命令來查看檢視容器,通常會包含一些非常有用的信息
docker inspect mysql_server

設(shè)置容器端口
啟動mysql后,可以使用-p 宿主端口:容器端口參數(shù)映射容器端口與宿主機端口,宿主端口和容器端口設(shè)置成不一樣的只
比如12345:54321表示宿主的12345端口映射到容器的54321端口.
上面已經(jīng)啟動了一個mysql容器,容器中mysql進(jìn)程監(jiān)聽的是容器的3306端口,由于沒有指定端口映射,在宿主機是無法訪問容器中的mysql.
如果想要外部訪問,啟動一個新的mysql容器并綁定到宿主機的3306端口.
docker run -e MYSQL_ROOT_PASSWORD=123456 --name mysql_server_new -p 3306:3306 -d mysql:5.6

可以使用
docker port container_id/name來查看一下容器的端口映射
docker port mysql_server_new
3306/tcp -> 0.0.0.0:3306
還可以使用docker ps,可以看到PORTS顯示 3306->3306,測試一下

注:此處表述有誤,無法訪問并不是完全無法訪問,使用iptable工具映射過去也可以,比較麻煩而已.
關(guān)閉容器
使用docker container start/stop/restart container_id來啟動或停止一個容器
除此之外,還可以使用docker -kill container_id 來強行停止一個容器
刪除容器
使用docker rm container_i來刪除一個容器,下面id為226db43edaed和ab3d300443cd的容器.

導(dǎo)入導(dǎo)出
使用docker export container_id > localfile導(dǎo)出容器快照為本地文件.
docker export mysql_server_new > mysql.tar
使用docker import file/url image_name:tag來將一個容器快照導(dǎo)入為本地快照
docker import mysql.tar mysql_import_test:v1

mysql容器的快照被導(dǎo)入成了一個本地鏡像.
可以使用docker commit命令將本地容器快照導(dǎo)出為一個本地鏡像
docker commit -a "zhangsheng" -m "mysql image" mysql_server_new test_mysql:v11111

commit參數(shù)如下
- -a :提交的鏡像作者
- -c :使用
Dockerfile指令來創(chuàng)建鏡像 - -m :提交時的說明文字
- -p :在commit時,將容器暫停