Docker安装
输入以下命令即可在Ubuntu18.04上配置Docker:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
容器运行
环境就绪,马上运行第一个容器,执行命令:
sudo docker run -d -p 1998:80 httpd
此时打开浏览器输入对应端口地址http://localhost:1998即可:
hello-world
输入以下命令即可运行hello-world:
sudo docker pull hello-world
sudo docker run hello-world
构建镜像
首先,新建Dockfile,其内容如下:
FROM ubuntu
RUN apt-get update && apt-get install -y --fix-missing vim
接着,在Dockfile同目录下运行以下命令:
sudo docker build -t ubuntu-with-vi-dockerfile .
然后便可查看新添的ubuntu-with-vi-dockerfile镜像:
使用镜像缓存
更改Dockerfile,其内容如下:
FROM ubuntu
RUN apt-get update && apt-get install -y --fix-missing vim
COPY testfile /
此时输入以下命令,可看到构建过程使用了缓存:
sudo docker build -t ubuntu-with-vi-dockerfile-2 .
输入sudo docker run -it ubuntu-with-vi-dockerfile-2 ,后输入ls查看文件,显示testfile文件存在于系统中:
RUN vs CMD vs ENTRYPOINT
修改Dockerfile为:
FROM ubuntu
RUN apt-get update && apt-get install -y --fix-missing vim
ENTRYPOINT ["/bin/echo","Hello"]
CMD ["world"]
输入以下命令构建新镜像:
sudo docker build -t ubuntu-with-vi-dockerfile-3 .
构建成功后,运行该镜像,有如下显示:
带参数"Cloudman"运行时,有如下显示:
可以看到,ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。
tag 的使用
以下操作为hello-world打上tag值1:
使用公共 Registry
登录docker账号:
修改镜像的 repository 使之与 Docker Hub 账号匹配:
sudo docker tag hello-world stories1998/hello-world:1
上传镜像:
sudo docker push stories1998/hello-world:1
登录 https://hub.docker.com,在Public Repository 中就可以看到上传的镜像:
进入容器
docker attach
直接进入容器启动命令的终端,不会启动新的进程。
docker exec
则是在容器中打开新的终端,并且可以启动新的进程。
容器常用操作
1.通过 docker stop
可以停止运行的容器
2.docker start
会保留容器的第一次启动时的所有参数
3.docker restart
可以重启容器,其作用就是依次执行 docker stop
和docker start
4.有时我们只是希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause
5.处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause
恢复运行
6.可以通过 docker rm
删除容器
限制容器对内存的使用
下面我们将使用 progrium/stress 镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试。执行如下命令:
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
–vm 1:启动 1 个内存工作线程。
–vm-bytes 280M:每个线程分配 280M 内存。
运行结果如下:
如果让工作线程分配的内存超过 300M,结果如下:
限制容器对CPU的使用
比如在 host 中启动了两个容器:
docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu
container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。
查看容器进程
输入ps axf
即可
可以看到,所有容器的进程都挂在 dockerd 进程下,同时也可以看到容器自己的子进程。
查看网络
输入sudo docker network ls
即可:
可以看到,Docker 安装时会自动在 host 上创建三个网络
自定义容器网络
输入sudo docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
即可创建子网段为172.22.16.0/24,网关为172.22.16.1,名称为my_net2的容器网络:
接着查看网络情况:
显示创建成功。
为镜像指定子网:
sudo docker run -it --network my_net2 ubuntu-with-vi-dockerfile
该ubuntu容器自动分配ip为172.22.16.2,现尝试ping网关172.22.16.1:
说明该ubuntu容器与网关互通
再新建一ubuntu容器,分配ip为172.22.16.3,尝试与旧容器ping:
ping通,说明处于同一子网的两容器网络互通。
为 httpd 容器添加一块 net_my2 的网卡:
进入新ubuntu容器,ping http容器,显示可以获得http容器的返回内容:
说明两者网络互通。
docker DNS server
下面启动两个容器 bbox1 和 bbox2:
sudo docker run -it --network=my_net2 --name=bbox1 busybox
sudo docker run -it --network=my_net2 --name=bbox2 busybox
然后,bbox2 就可以直接 ping 到 bbox1 了:
joined 容器
先创建一个 httpd 容器,名字为 web1。
sudo docker run -d -it --name=web1 httpd
然后创建 busybox 容器并通过 --network=container:web1
指定 jointed 容器为 web1,并获取httpd容器的反馈:
可以看出,busybox 可以直接用 127.0.0.1 访问 web1 的 http 服务。
外部世界如何访问容器
docker 可将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器。容器启动时通过-p参数映射端口:
容器启动后,可通过 docker ps 或者 docker port 查看到 host 映射的端口。在上面的例子中,httpd 容器的 80 端口被映射到 host 32773 上,这样就可以通过 :<32773> 访问容器的 web 服务了。
以 0.0.0.0:32773->80/tcp 为例分析整个过程:
docker-proxy 监听 host 的 32773 端口,
当 curl 访问 10.0.2.15:32773 时,docker-proxy 转发给容器 172.17.0.3:80,
httpd 容器响应请求并返回结果。
查看 Ubuntu 的默认 driver
输入sudo docker info
即可:
bind mount
例如 docker host 上有文件 ~/Docker/testfile:
通过 -v 将其 mount 到 ubuntu 容器:
-v 的格式为 :
docker managed volume
我们通过 -v 告诉 docker 需要一个 data volume,并将其 mount 到 /usr/local/123:
用 volume container 共享数据
volume container 是专门为其他容器提供 volume 的容器。它提供的卷可以是 bind mount,也可以是 docker managed volume。下面我们创建一个 volume container:
我们将容器命名为 vc_data(vc 是 volume container 的缩写)。
通过 docker inspect 可以查看到这个 volume:
其他容器可以通过 --volumes-from 使用 vc_data 这个 volume container:
volume 生命周期管理
docker 提供了 volume 子命令可以对 docker managed volume 进行维护。请看下面的例子:
如果想批量删除孤儿 volume,可以执行:
docker volume rm $(docker volume ls -q)
来源:CSDN
作者:Stories_z
链接:https://blog.csdn.net/Stories_z/article/details/103541332