容器
docker run ubuntu:18.04 echo hello docker
表示用18.04的ubuntu鏡像建立一個容器,用這個容器來執行echo指令
-
表示一個運作一個最新的ubuntu容器,并且進入到這個容器的bash中(不加i雖然可以進入bash,但是不可互動)。退出容器用docker run -i -t ubuntu [bash]
或exit
(退出時會關閉&不删除容器)ctrl+D
-
容器背景運作,運作時的輸出不會出現在主控端的控制台上docker run -i -t -d ubuntu
-
指定容器的名稱docker run --name containerName -it ubuntu bash
-
檢視正在運作的容器docker ps
-
: 檢視所有容器,包括已經建立但是不在運作中的容器-a
-
-
檢視背景運作的容器的輸出docker logs <id/name>
-
啟動一個已經停止的容器docker start id/name
-
停止一個容器docker stop id/name
-
檢視容器内部運作的程序docker top name
-
檢視容器的配置和狀态docker inspect name
進入背景運作的容器
-
從容器中退出時,容器也會停止docker attach
-
不會導緻容器的停止docker exec
-
重新開機正在運作的容器,docker restart [-t seconds] id
表示等待的時間(秒)-t
docker run -d --name containerTest3 ubuntu:18.04
和
docker run -itd --name containerTest2 ubuntu:18.04
效果不一樣,前者建立後就被停止了,後者在背景保持運作狀态
容器的導入和導出
導出容器的狀态,導入後變成鏡像,不會儲存原始鏡像的layer資訊。
導出容器
-
docker export containerid> ubuntu.tar
導入容器
-
: 導入成了一個image,可以用cat ubuntu.tar | docker import - mysystem:mytag
檢視,docker images
-
docker import dockertest.tar -- centos:tag
-
: windows下可以這樣導入docker import - 容器:tag < fileName.tar
[[email protected] ~]$ cat containerTest2.tar | docker import - mysystem:tags
sha256:1c174e9fbdee72b5427701e22033105a2c41d626f418501497240902bc5667ac
[[email protected] ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysystem tags 1c174e9fbdee 8 seconds ago 64.2MB
ubuntu 18.04 2eb2d388e1a2 6 days ago 64.2MB
nginx latest 8cf1bfb43ff5 9 days ago 132MB
training/webapp latest 6fae60ef3446 5 years ago 349MB
删除容器
删除容器時容器必須已經是關閉狀态
-
docker rm -f id
-
清理掉所有終止狀态的容器docker container prune
容器連接配接
端口映射
-
映射到主機的随機端口(大P)docker run -d -P training/webapp python app.py
-
自行指定端口(小p)docker run -d -p 5000:5000 training/webapp python app.py
-
指定主機的網絡位址,将docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
映射到容器的5000端口127.0.0.1:5001
-
: 檢視映射關系docker port name [port]
-
綁定udp端口需要再端口後加上run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
/udp
容器互聯
建立網絡
[[email protected] ~]$ docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
-
建立一個網絡docker network create -d bridge test-net
-
: 指定網絡類型,-d
bridge、overlay
-
運作一個容器并連接配接到建立的
test-net
網絡:
-
docker run -itd --name netSlave1 --network testNet twilight/nginx:ali
打開新的終端,再運作一個容器并加入到 test-net 網絡:
-
docker run -itd --name netSlave2 --network testNet twilight/nginx:ali
安裝
ping
:
apt-get update
apt install iputils-ping
ping netSlave2
竟然直接ping了name(hostname是他的id, 他的hosts檔案中記錄了另一個容器的ip)
配置DNS
在主控端的 /etc/docker/daemon.json 檔案增加一下内容:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
重新開機生效,DNS會被應用到所有容器上
docker run -it --rm ubuntu cat etc/resolv.conf
[email protected]:/# cat /etc/resolv.conf
search localdomain
nameserver 114.114.114.114
nameserver 8.8.8.8
手動指定容器的DNS:
docker run -it --hostname slavehostname --dns=114.114.114.114 ubuntu:18.04 /bin/bash
[[email protected] docker]# docker run -it --hostname slavehostname --dns=114.114.114.114 ubuntu:18.04 /bin/bash
[email protected]:/# cat /etc/resolv.conf
search localdomain
nameserver 114.114.114.114
參數說明:
-
或-h HOSTNAME
: 設定容器的主機名,它會被寫到容器内的--hostname=HOSTNAME
和/etc/hostname
。/etc/hosts
-
: 添加 DNS 伺服器到容器的--dns=IP_ADDRESS
中,讓容器用這個伺服器來解析所有不在 /etc/hosts 中的主機名。/etc/resolv.conf
-
: 設定容器的搜尋域,當設定搜尋域為 .example.com 時,在搜尋一個名為 host 的主機時,DNS 不僅搜尋 host,還會搜尋--dns-search=DOMAIN
。host.example.com
如果在容器啟動時沒有指定
--dns
和
--dns-search,Docker
會預設用宿主主機上的
/etc/resolv.conf
來配置容器的 DNS。
鏡像
-
列出本地的所有鏡像docker images
-
下載下傳鏡像docker pull
-
查找相關的鏡像,或者在docker search ""
檢視http://hub.docker.com
-
删除鏡像docker rmi 鏡像:tag
-
建立一個新的鏡像,舊的鏡像保留docker tag oldenv:tag 使用者名/newenv:newtag
-
推送自己的鏡像到hub上,鏡像的名字必須是docker push 使用者名/newenv:newtag
使用者名/envname:tag
建立鏡像
把容器導出成鏡像
-
送出一個容器成為鏡像docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
-
: 送出的描述資訊-m
-
: 指定鏡像作者-a
-
:容器 IDe218edb10161
-
: 指定要建立的目标鏡像名runoob/ubuntu:v2
-
-
可以檢視到送出的鏡像,和容器的導入效果一樣的docker images
[[email protected] ~]$ docker commit -m "nginx with ali sources" -a "twilight" e6547d259b8f twilight/nginx:ali
sha256:378d7ca4a813dd691df890bcb639228a81cc1b58440094cf9431883a8a9003d2
[[email protected] ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
twilight/nginx ali 378d7ca4a813 8 seconds ago 229MB
mysystem tags 1c174e9fbdee 4 minutes ago 64.2MB
ubuntu 18.04 2eb2d388e1a2 6 days ago 64.2MB
nginx latest 8cf1bfb43ff5 9 days ago 132MB
training/webapp latest 6fae60ef3446 5 years ago 349MB
導出&導入鏡像到檔案
導出鏡像的所有資訊,導入後的鏡像和原有的鏡像一緻。(注意與導出容器的差別)
-
導出鏡像到檔案docker save centos:self -o centos.tar
-
導入檔案成鏡像docker load -i imagedata.tar
- 可與
配合使用docker commit containerid imagename:tag
從零建構鏡像
Dockerfile中每一行都産生一個層都有一個id,可能多個容器之間會共享一些層,可以節省資源。
-
: 建構一個鏡像,需要一個docker build
檔案Dockerfile
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
-
建立一個鏡像docker build -t runoob/centos:6.7 .
-
: 表示目标鏡像名-t
-
: 表示Dockerfile檔案所在的目錄.
-
坑
自帶的ubuntu會因為缺少證書而無法更新源,隻能先用舊的源安裝上缺少的證書
The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 3B4FE6ACC0B21F32
[email protected]:/etc/apt# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
Executing: /tmp/apt-key-gpghome.SysU7qEDMN/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
gpg: key 3B4FE6ACC0B21F32: public key "Ubuntu Archive Automatic Signing Key (2012) <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1