1.docker 的官方教程已经讲得很详细了, 我这里就只做学习记录 https://docs.docker.com/

2.安装就按照教程好了

3.一些命令

docker –version 查看当前 docker 版本

docker create 创建一个容器但是不运行它
docker rm 删除容器
docker run 创建并运行一个容器
docker start 运行一个停止了的容器
docker stop 停止一个容器
docker attach 附着到一个运行中的容器中 docker ps -a 列出所有容器
docker ps -l 列出最后运行的那个容器
docker ps 列出正在运行的容器
docker logs 查看容器最后几条日志 docker logs -f 查看日志流
docker top 查看容器内部各进程信息
docker stats 查看容器内各进程信息, 更加详细
docker exec -it [containerID] /bin/bash 在运行中的容器后台创建一个新的进程
docker inspect 查看一个容器详细信息
docker volume create fancygo_docker 创建一个卷

docker image ls 列出当前所有的镜像
docker pull 拉取镜像
docker search 搜索镜像
docker history 查看一个镜像经过哪些步骤构建而来
docker rmi 删除镜像
docker push [imageName] 把自己的镜像推送到 DockerHub

docker login 登录 dockerhub
docker logout 退出 dockerhub

docker info 查看 docker 程序运行信息

4. 教程

  1. 运行第一个容器
docker run --name ubuntu -i -t ubuntu /bin/bash

创建一个名为 ubuntu 的交互式的 ubuntu 系统容器

  1. 编写 Dockerfile
FROM ubuntu:20.04
MAINTAINER FancyGo "717632318@qq.com"
RUN apt update && apt install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80

这是一个简单的例子, FROM 设置基础镜像
MAINTAINER 用来设置作者
RUN 会在当前镜像运行指定的命令
EXPOSE 告诉镜像可能会用到 80 端口

  1. 构建
docker build -t="fancygo/web" .

构建过程中如果出现错误, 可以找到上一个构建成功的镜像层, 然后直接进入调试, 找出错误

docker run -i -t [imageid] /bin/bash
  1. 运行
docker run -d -p 80 --name fancygo_web fancy/web nginx -g "daemon off;"

-d 表示在后台运行容器
nginx -g “daemon off;” 是容器中运行的命令, 以前台方式运行 nginx, 作为 web 服务器
-p 表示开放哪些端口给主机, 这里是 80 端口, 主机端口随机映射

docker ps
docker port [containerID]

上面两种方法都可以看到容器的端口映射到主机的端口

curl hostIP:hostPort

此时使用 curl 命令就能看到 nginx 的内容了

-p 选项可以设置指定主机端口映射

docker run -d -p 8080:80 --name fancygo_web fancy/web nginx -g "daemon off;"

这里就是将容器的 80 端口映射到主机的 8080 端口

docker run -d -p 127.0.0.1:8080:80 --name fancygo_web fancy/web nginx -g "daemon off;"

这里就是将容器的 80 端口映射到主机的 127.0.0.1 的 8080 端口上

-P 选项可以公开所有在 Dockerfile 中所有 EXPOSE 的端口

docker run -d -P --name fancygo_web fancy/web nginx -g "daemon off;"

这里就会将 Dockerfile 中所有 EXPOSE 的端口映射到主机的随机端口上

docker run --privileged

特权模式, 容器对主机拥有 root 访问权限

docker run -h="fancy" 设置容器主机名 --rm 运行完删除容器 --volumes-from [containerName] 从某个容器继承卷

5. Dockerfile 参数讲解

FROM ubuntu:20.04
MAINTAINER FancyGo "717632318@qq.com"
ENV VER 1
RUN apt update
CMD ["/bin/bash", "-l"]
ENTRYPOINT ["/usr/sbin/nginx"]
WORKDIR /go
USER fancy
VOLUME ["/opt/temp"]
ADD text.txt /opt/text
COPY 
LABEL version="1.0" location="Su Zhou" 
STOPSIGNAL
  1. FROM 指定一个基础镜像
  2. MAINTAINER 指定作者
  3. ENV 用来在 image 构建时设置一个环境变量, 当这个环境变量有修改时, 就会重置缓存, 包缓存也会被刷新成新的
    这些变量在容器运行时同样有效, 运行时 env 指令可以查看
    docker run -e 选项可以在运行时指定环境变量
  4. RUN 指定镜像构建时需要执行的命令
  5. CMD 指定容器启动时需要执行的命令, 命令需要存放在数组结构中
    docker run 时指定的命令会覆盖 CMD, 多条 CMD 指令只有最后一条会被执行
  6. ENTRYPOINT 也用来指定一个执行命令
    docker run 时的命令不会覆盖它
  7. WORKDIR 设置工作区目录, 可以设置 image 构建时的目录, 也可以设置 CMD 或 ENTRYPOINT 运行命令时的目录 docker run -w 选项可以在运行时指定工作目录
  8. USER 会指定容器以哪个用户身份来运行 docker run -u 选项可以在运行时指定用户身份
  9. VOLUME 向容器添加卷
  10. ADD 用来将构建环境下的文件和目录复制到镜像中 源文件也可以是一个 URL, ADD 还会把 gzip, bzip2, xz 格式的归档文件自动解包, ADD 会使构建缓存无效
  11. COPY 用法和 ADD 类似, 但是只关心构建上下文的本地文件
  12. LABEL 用来向镜像添加元数据, 以键值对的形式设置
  13. STOPSIGNAL 用来设置停止容器时发送什么系统信号给容器

6. docker network

  1. docker network create docker_net 创建一个 docker 网络, 命名为 docker_net
  2. docker network inspect [netName] 查看这个新建的网络
  3. docker network ls 查看当前所有网络
  4. 也可以创建一个多宿主机的 overlay 网络
  5. docker run -p 7778 –net=docker_net –name=fancygo_gamesvr -d -v $PWD/webapp:/opt/webapp fancygo/gamesvr /bin/bash
    在指定的 network 中运行容器
  6. 之后在两个容器之间就可以使用 ping [name/name.netname] ping 通了(我在 /etc/hosts 中没有找到到 dns 信息, 不知道 ping 是从哪读的)
  7. docker network connect [netName] [containerName] 将一个正在运行的容器加入到 network 中

7. 一些问题

  1. 构建的时候 apt 安装一些软件需要读取用户输入, 这个时候需要加上 -y 标志, 比如 apt install -y vim
  2. docker 运行的时候, 环境变量 .bashrc 不生效, 你需要在 Dockerfile 文件中用 ENV 加上
  3. run DEBIAN_FRONTEND=noninteractive apt install -y tzdata 防止出现因 tzdata 交互问题而停止构建