Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化;容器是完全使用沙箱机制,相互之间不会有任何接口。
可以理解为寄存在主机上的特殊的虚拟机,它利用特殊的虚拟化技术,比一般的虚拟化技术能够更加高效合理的利用资源;一台主机上可以创建众多的容器,通过特定的方式与主机共享硬件资源,并且使用特定的端口访问特定的文件;通过 Docker ,一台主机能够运行多种不同的服务。
image.png

原理

网络

Docker 容器 - 图2
安装完 Docker 系统会自动添加一个供 Docker 使用的网桥docker0
共五种模式,docker run 后面使用 —net=进行配置

bridge

dokcer网络的默认设置,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈,是最常用的使用方式

host

这个模式下创建出来的容器,直接使用容器宿主机的网络命名空间,将不拥有自己独立的 Network Namespace,即没有独立的网络环境,使用宿主机的 IP 和端口

none

为容器创建独立网络命名空间,但不为它做任何网络配置,容器中只有 lo,用户可以在此基础上,对容器网络做任意定制(pipework配置ip)

container

指定一个已有的容器,共享该容器的 IP 和端口,除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的
—net=container:NAME_or_ID

自定义

使用第三方的网络实现或者创建单独的 bridge 网络,提供网络隔离能力

入门

安装

  1. #先更行一下软件包缓存
  2. yum update
  3. #ce 代表社区版
  4. yum install -y docker-ce
  5. #使用官方脚本安装
  6. curl https://get.docker.com | sh
  1. #设置自启动
  2. systemctl enable docker
  3. #启动 Docker
  4. systemctl start docker

非特权用户使用 Docker

1.开通 root 权限

  1. ll /etc/sudoers
  2. chmod 755 /etc/sudoers
  3. vi /etc/sudoers
  4. # User privilege specification
  5. root ALL=(ALL:ALL) ALL
  6. #允许 xxx 组成员使用 sudo,需要密码
  7. %xxx ALL=(ALL:ALL) ALL
  8. #允许 xxx 组成员使用 sudo,免密
  9. %xxx ALL=(ALL:ALL) NOPASSWD: ALL
  10. #允许 xxx 使用 sudo,需要密码
  11. xxx ALL=(ALL:ALL) ALL
  12. #允许 xxx 使用 sudo,免密
  13. xxx ALL=(ALL:ALL) NOPASSWD: ALL

2.加入 docker 组

Docker 安装之后默认会创建 docker 组,它拥有读取套接字权限,因此将该普通用户加入 docker 组就有访问 unix 套接字的权限,然后刷新用户的初始组即可。

  1. #查询 docker 组是否创建,不存在需要手动创建
  2. cat /etc/group | grep docker
  3. groupadd docker
  4. #查询套接字是否是 docker 组,不是需要修改
  5. ll /var/run/docker.sock
  6. chgrp docker /var/run/docker.sock
  7. #将用户加入 docker 组,然后刷新用户组
  8. gpasswd -a xxx docker
  9. newgrp xxx

镜像

  1. docker search [镜像名称]
  2. docker pull [镜像名称]
  3. docker run -d --name=demo -p 8080:80 [镜像名称]

管理

常用命令

image.png

  1. #查看运行中的容器
  2. docker ps
  3. #查看所有容器,包括停止的
  4. docker ps -a
  5. #查看安裝的镜像
  6. docker images
  7. #正常停止容器
  8. docker stop <容器名称/ID>
  9. #启动已有容器
  10. docker start <容器名称/ID>
  11. #强制停止容器
  12. docker kill <容器名称/ID>
  13. #进入容器,运行脚本
  14. docker exec -it <容器名称/ID> /bin/bash
  15. #查看容器日志
  16. docker logs <容器名称/ID> -f

镜像构建

构建镜像有两种方法:

  • 使用 docker commit 命令
  • 使用 docker build 命令和 Dockerfile 文件

    Dockerfile

    https://m.runoob.com/docker/docker-dockerfile.html
    在项目根目录创建 Docker 文件夹(名字自定)
    切换到该文件夹,创建 Dockerfile 文件 ```bash vi Dockerfile

指定基础镜像,只能一个

FROM nginx

提供联系方式等信息

MAINTAINER MyTestAPP

拷贝文件

COPY ./dist/ /usr/share/nginx/html/ COPY ./nginx/nginx.conf /etc/nginx/nginx.conf

指令执行成功会创建一个新的镜像层,然后继续执行 Dockerfile 中的下一个指令

RUN xxxx

指定容器端口号

EXPOSE 80

设置容器启动后第一个命令,docker run 附加 —entrypoint 会被覆盖

ENTRYPOINT [“top”,”-b”, “-H”]

设置容器启动的第一个命令的默认参数,docker run 带有其他命令参数会被覆盖

CMD [“/usr/sbin/sshd” , “-D”]

  1. 保存文件,执行`docker build -t 名称`进行构建
  2. ```bash
  3. docker build -t test/myapp:v1 ./
  4. docker build -f 指定 Dockerfile 文件所在路径和文件名

使用docker images查看构建镜像

  1. docker history test/myapp:v1
  2. docker inspect test/myapp:v1

容器运维

启动容器

  1. docker run d --name myapp p 80:80 test/myapp:v1
  2. docker ps a
  3. docker logs myapp