Linux docker 的使用
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. 教程
- 运行第一个容器
docker run --name ubuntu -i -t ubuntu /bin/bash
创建一个名为 ubuntu 的交互式的 ubuntu 系统容器
- 编写 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 端口
- 构建
docker build -t="fancygo/web" .
构建过程中如果出现错误, 可以找到上一个构建成功的镜像层, 然后直接进入调试, 找出错误
docker run -i -t [imageid] /bin/bash
- 运行
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
- FROM 指定一个基础镜像
- MAINTAINER 指定作者
- ENV 用来在 image 构建时设置一个环境变量, 当这个环境变量有修改时, 就会重置缓存, 包缓存也会被刷新成新的
这些变量在容器运行时同样有效, 运行时 env 指令可以查看
docker run -e 选项可以在运行时指定环境变量- RUN 指定镜像构建时需要执行的命令
- CMD 指定容器启动时需要执行的命令, 命令需要存放在数组结构中
docker run 时指定的命令会覆盖 CMD, 多条 CMD 指令只有最后一条会被执行- ENTRYPOINT 也用来指定一个执行命令
docker run 时的命令不会覆盖它- WORKDIR 设置工作区目录, 可以设置 image 构建时的目录, 也可以设置 CMD 或 ENTRYPOINT 运行命令时的目录 docker run -w 选项可以在运行时指定工作目录
- USER 会指定容器以哪个用户身份来运行 docker run -u 选项可以在运行时指定用户身份
- VOLUME 向容器添加卷
- ADD 用来将构建环境下的文件和目录复制到镜像中 源文件也可以是一个 URL, ADD 还会把 gzip, bzip2, xz 格式的归档文件自动解包, ADD 会使构建缓存无效
- COPY 用法和 ADD 类似, 但是只关心构建上下文的本地文件
- LABEL 用来向镜像添加元数据, 以键值对的形式设置
- STOPSIGNAL 用来设置停止容器时发送什么系统信号给容器
6. docker network
- docker network create docker_net 创建一个 docker 网络, 命名为 docker_net
- docker network inspect [netName] 查看这个新建的网络
- docker network ls 查看当前所有网络
- 也可以创建一个多宿主机的 overlay 网络
- docker run -p 7778 –net=docker_net –name=fancygo_gamesvr -d -v $PWD/webapp:/opt/webapp fancygo/gamesvr /bin/bash
在指定的 network 中运行容器- 之后在两个容器之间就可以使用 ping [name/name.netname] ping 通了(我在 /etc/hosts 中没有找到到 dns 信息, 不知道 ping 是从哪读的)
- docker network connect [netName] [containerName] 将一个正在运行的容器加入到 network 中
7. 一些问题
- 构建的时候 apt 安装一些软件需要读取用户输入, 这个时候需要加上 -y 标志, 比如 apt install -y vim
- docker 运行的时候, 环境变量 .bashrc 不生效, 你需要在 Dockerfile 文件中用 ENV 加上
- run DEBIAN_FRONTEND=noninteractive apt install -y tzdata 防止出现因 tzdata 交互问题而停止构建