记录Docker使用过程中遇到的难点和问题

2023-02-17 14:59:37 浏览数 (1)

重新理解

1.Docker容器

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

被打包的程序可以是一个操作系统,也可以是Nginx应用,也可以是PHP等任意一种“程序”,打包之后的镜像可以在任意一台安装了Docker的主机上,完美的运行。

多个容器可以和不使用容器的应用一样,相互进行协作、通信,例如基于Docker的lnmp环境可以由 nginx、mysql、php三个容器进行实现。同时可以通过docker composer进行编排。

2.停止容器 

容器在创建之后,只要不删除就一直存在,并且保持着停止前的状态。

镜像就类似我们常用的.exe文件,执行之后就产生了这个程序的进程,容器就类似这个进程,一个镜像可以被同时运行很多次,产生多个容器。

3.修改容器端口映射、挂载目录

容器一旦生成,没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。

使用主机网络时,-p指定的端口映射将会失效。使用主机网络时不需要进行端口映射。

代码语言:javascript复制
# 容器内访问/home会链接到主机的/home/lnmp目录
docker run -idt -v /home/lnmp:/home --network host centos:centos7 /bin/bash
# window系统映射目录时 /D/path 代表D盘

# window测试
docker run -idt -v /F/swoole:/home --network bridge -p 6666:8081 phpswoole/swoole:latest /bin/bash

window本地目录挂载

window遇到挂载本地目录不生效的问题,而且run之后也不报错,最后将挂载目录放到了用户目录下面生效了。换了一台电脑测试,发现挂载到任意位置都可以,具体原因有待深究。

window下启动容器需要映射端口,host模式无法正常使用

4.关于容器

容器运行之后,会产生一个完整的服务器文件目录结构,针对运行的应用的不同,这个容器所带有的功能也不同(主要区别可exec 进行命令行后测试),例如一个centos应用具有操作系统的大部分功能命令,而Nginx应用容器只能操作Nginx;

5.修改apt安装源

将文件在本地创建,然后mv替换容器内的源文件即可,。

代码语言:javascript复制
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

#移动替换
mv sources.list /etc/apt/sources.list

6.apt无法更新

报错,提示连接不上镜像源,首先考虑DNS的问题。

代码语言:javascript复制
# 指定DNS
docker run -idt -v /C/swoole:/home --network bridge -p 6666:8081  --dns 114.114.114.114 phpswoole/swoole:latest  /bin/bash

7.window Docker

docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。

也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows10。

提示

主机网络驱动程序仅适用于Linux主机,并且不支持Docker for Mac,Docker for Windows或Docker EE for Windows Server。(网络查找得知,未见到官方文档)

8.容器内安装软件包

centos的yum,ubuntu的apt-get

代码语言:javascript复制
apt-get update
apt-get install  procps
apt-get install inetutils-ping

Docker空间清理 

突然发现被rm的容器仍然占用着存储空间,prune 命令用来删除不再使用的 docker 对象。

代码语言:javascript复制
# 删除所有未被 tag 标记和未被容器使用的镜像:
$ docker image prune

# 删除所有未被容器使用的镜像:
$ docker image prune -a

# 删除所有停止运行的容器:
$ docker container prune

# 删除所有未被挂载的卷:
$ docker volume prune

#删除所有网络:
$ docker network prune

# 删除 docker 上述所有
$ docker system prune

Docker性能损耗、优化

暂时没找到相关的资料,需要自己实际进行测试。

1.性能

IO、网络,对于IO可以把容器的应用运行时IO的目录挂载到容器的外部目录。对于网络可以指定使用服务器本身的网络 --network host;

0 人点赞