容器
docker run ubuntu:18.04 echo hello docker
表示用18.04的ubuntu镜像新建一个容器,用这个容器来执行echo命令
docker run -i -t ubuntu [bash]
表示一个运行一个最新的ubuntu容器,并且进入到这个容器的bash中(不加i虽然可以进入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
导入容器
cat ubuntu.tar | docker import - mysystem:mytag
: 导入成了一个image,可以用docker images
查看,docker import dockertest.tar -- centos:tag
docker import - 容器:tag < fileName.tar
: windows下可以这样导入
[wangchao@localhost ~]$ cat containerTest2.tar | docker import - mysystem:tags
sha256:1c174e9fbdee72b5427701e22033105a2c41d626f418501497240902bc5667ac
[wangchao@localhost ~]$ 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
清理掉所有终止状态的容器
容器连接
端口映射
-
docker run -d -P training/webapp python app.py
映射到主机的随机端口(大P) -
docker run -d -p 5000:5000 training/webapp python app.py
自行指定端口(小p) -
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
指定主机的网络地址,将127.0.0.1:5001
映射到容器的5000端口 -
docker port name [port]
: 查看映射关系 -
run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
绑定udp端口需要再端口后加上/udp
容器互联
新建网络
[wangchao@localhost ~]$ 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
root@1718bc16f2e6:/# 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
[root@localhost docker]# docker run -it --hostname slavehostname --dns=114.114.114.114 ubuntu:18.04 /bin/bash
root@slavehostname:/# cat /etc/resolv.conf
search localdomain
nameserver 114.114.114.114
参数说明:
-h HOSTNAME
或--hostname=HOSTNAME
: 设定容器的主机名,它会被写到容器内的/etc/hostname
和/etc/hosts
。--dns=IP_ADDRESS
: 添加 DNS 服务器到容器的/etc/resolv.conf
中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。--dns-search=DOMAIN
: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索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
创建一个新的镜像,旧的镜像保留docker push 用户名/newenv:newtag
推送自己的镜像到hub上,镜像的名字必须是用户名/envname:tag
创建镜像
把容器导出成镜像
-
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
提交一个容器成为镜像-m
: 提交的描述信息-a
: 指定镜像作者e218edb10161
:容器 IDrunoob/ubuntu:v2
: 指定要创建的目标镜像名
-
docker images
可以查看到提交的镜像,和容器的导入效果一样的
[wangchao@localhost ~]$ docker commit -m "nginx with ali sources" -a "twilight" e6547d259b8f twilight/nginx:ali
sha256:378d7ca4a813dd691df890bcb639228a81cc1b58440094cf9431883a8a9003d2
[wangchao@localhost ~]$ 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 "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG="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
root@e6547d259b8f:/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) <ftpmaster@ubuntu.com>" imported
gpg: Total number processed: 1
gpg: imported: 1