Docker带你入门

50 阅读6分钟

docker

docker ps 查看运行中的容器

docker ps -a查看所以容器(包括已停止容器)

docker search nginx搜索镜像

docker pull nginx下载镜像

docker pull nginx:1.26.0下载指定版本镜像

docker images查看所有镜像

docker rmi xxx删除指定镜像 ,xxx 为 id

docker run nginx运行一个新容器

-d 为后台运行

--name 为容器取名

-p 端口映射 --因为docker里面也是小虚拟机,所以本机访问80端口,是访问不到docker里的nginx

端口映射就是让我本机访问80 就是访问docker里面的80端口

docker run -d --name nginx -p 80:80 nginx

docker stop nginx停止容器

docker start xxx启动容器xxx 为 id

docker restart xxx重启容器xxx 为 id

docker stats xxx查看容器资源占用情况:xxx 为 id

docker logs xxx 查看容器日志xxx 为 id

docker rm -f xx 强制删除指定容器xxx 为 id

docker exec xxx 进入容器内,

-it 以交互的方式

docker exec -it xxx. /bin/bash. 以控制台进入

docker commit xxx 将修改后的镜像 重新打包

-m 注释信息

docker commit -m '注释信息' xxx

docker save nginx:v1.0 保存镜像 ,保存的文件是压缩包 (tar) 可以把包给别人部署

那么别人如何加载呢? 使用docker load -i xxx.tar

登录 docker hub

docker login

重新给镜像打标签

docker tag mynginx:v1.0 leifengyang/mynginx:v1.0

推送镜像

docker push leifengyang/mynginx:v1.0

存储

两种方式,注意区分:

●目录挂载: -v /app/nghtml:/usr/share/nginx/html

●卷映射:-v ngconf:/etc/nginx

目录挂载(Host Directory Mount)

目录挂载是把宿主机上的一个具体的目录直接映射到容器内的一个目录。

举个例子

复制编辑
docker run -d -v /app/nghtml:/usr/share/nginx/html nginx
  • /app/nghtml:宿主机上的一个本地文件夹。
  • /usr/share/nginx/html:容器内的文件夹。

这意味着你容器内的 /usr/share/nginx/html 目录就指向了宿主机上的 /app/nghtml 目录。所有你在宿主机 /app/nghtml 里修改的文件,容器内 /usr/share/nginx/html 会实时反映出来。

特点

  • 数据存储在宿主机的文件系统中,直接与宿主机的文件夹相关联。
  • 修改宿主机的文件,会立即反映到容器内;反之亦然。
  • 适用于开发环境,因为它能快速同步文件变动。
  • 宿主机和容器文件系统紧密耦合,如果宿主机上的目录删除了,容器内的目录也会受影响。

2. 卷映射(Volume Mount)

卷映射是 Docker 提供的一种抽象的存储机制。当你使用卷映射时,Docker 会在宿主机上的某个地方创建一个卷,而容器会把它挂载到容器内的某个路径。

举个例子

​
复制编辑
docker volume create mynginxconf
docker run -d -v mynginxconf:/etc/nginx nginx
  • mynginxconf:这是一个 Docker 卷,它实际上会存储在 Docker 管理的目录中,不直接暴露给你宿主机。
  • /etc/nginx:容器内的目标路径。

这意味着,mynginxconf 是一个由 Docker 管理的存储,它与宿主机文件系统的具体位置不直接关联。你无法像目录挂载那样直接访问宿主机的文件系统位置。容器中的 /etc/nginx 会映射到 Docker 卷 mynginxconf

特点

  • 卷是 Docker 管理的存储,你通常看不到它存储在宿主机的哪个目录下,Docker 会自动管理它的存储位置。
  • 容器内的数据不会直接影响宿主机文件系统,而是存储在 Docker 卷中。
  • 卷能够跨容器共享数据,多个容器可以挂载同一个卷,方便共享数据。
  • 适用于生产环境,因为卷的数据存储由 Docker 管理,比较稳定且不会受宿主机目录的删除或移动影响。

区别总结:

特性目录挂载(Host Directory Mount)卷映射(Docker Volume Mount)
存储位置宿主机文件系统的具体路径Docker 管理的存储路径(通常看不见)
数据持久化数据在宿主机上,容器删除数据也会丢失数据持久化,容器删除数据不会丢失
跨容器共享仅限于当前容器和宿主机间的数据共享可以跨多个容器共享数据
操作简便性直接操作宿主机文件(宿主机文件系统可见和可操作)Docker 管理,不能直接操作宿主机的存储位置
适用场景开发环境,快速更新,宿主机和容器需要频繁同步数据生产环境,数据持久化,跨容器共享,独立于宿主机文件

举个更具体的例子:

  1. 目录挂载: 假设你正在开发一个网站,并且你希望容器内的 Nginx 服务提供宿主机上的网页内容。在开发过程中,你可能需要频繁修改这些网页文件,这时你可以使用目录挂载。
  bash
​
​
  复制编辑
  docker run -d -v /app/nghtml:/usr/share/nginx/html nginx
  • 每当你修改宿主机的 /app/nghtml 目录中的文件,Nginx 容器内的网页会立刻更新。

  1. 卷映射: 假设你要持久化 Nginx 的配置文件,并且在多个容器之间共享这些配置。使用卷映射可以把配置文件存储在 Docker 管理的卷中。
  bash
​
​
  复制编辑
  docker volume create nginx_config
  docker run -d -v nginx_config:/etc/nginx nginx
  • 即使容器删除了,nginx_config 卷中的配置文件仍然存在,可以被其他容器挂载和使用。

最后总结:

  • 目录挂载是直接将宿主机的文件夹挂载到容器中,适合开发环境,实时同步文件。
  • 卷映射是将 Docker 管理的存储挂载到容器中,适合生产环境,支持持久化数据存储,且能够跨容器共享。

Dockerfile

# 使用官方 Node.js 镜像作为基础镜像
FROM node:14
​
# 设置工作目录
WORKDIR /app
​
# 将当前目录下的 package.json 文件复制到镜像中的工作目录
COPY package.json .
​
# 安装依赖 构建阶段执行
RUN npm install    
​
# 将当前目录下的所有文件复制到镜像中的工作目录
COPY . .
​
# 暴露容器内的端口
EXPOSE 3000
​
# 启动应用 只有一个CMD
CMD ["npm", "start"]

docker build -f dockerfile -t aurora-serve:v1.0.0 .

-f 指定 dockerfile. -t 指定镜像名

dockercompose

services:
  mysql:
    image: mysql:lts
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: test
    volumes:
      - /Users/xxx/mysql/data:/val/lib/mysql
      - /Users/xxx/mysql/conf:/etc/mysql/conf.d
      - /Users/xxx/mysql/log:/var/log/mysql
    ports:
      - "3306:3306"
    networks:
      - aurora-net
  aurora-serve:
    build:  //使用dockerfile文件
      context: ./server //这里是路径
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    depends_on:
      - mysql

    networks:
      - aurora-net
  aurora-web:
    build:
      context: ./web
      dockerfile: Dockerfile
    networks:
      - aurora-net
    depends_on:
      - aurora-serve

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - aurora-serve
      - aurora-web
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - aurora-net
networks:  //网络保持一致
  aurora-net:
    driver: bridge