docker实战

打印 上一主题 下一主题

主题 545|帖子 545|积分 1635

docker实战笔记

一、安装docker

下面以ubuntu系统举例:
卸载已有的旧版本docker
  1. $ sudo apt-get remove docker \
  2.                docker-engine \
  3.                docker.io
复制代码
使用apt安装最新版docker
  1. $ sudo apt-get update
  2. $ sudo apt-get install \
  3.     apt-transport-https \
  4.     ca-certificates \
  5.     curl \
  6.     gnupg \
  7.     lsb-release
复制代码
更新apt软件包缓存
  1. $ sudo apt-get update
  2. # 安装docker-ce
  3. $ sudo apt-get install docker-ce docker-ce-cli containerd.io
复制代码
启动docker
  1. # 使用系统命令启动docker
  2. $ sudo systemctl enable docker
  3. $ sudo systemctl start docker
复制代码
建立docker用户组
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组
  1. # 建立docker用户组
  2. $ sudo groupadd docker
  3. # 将用户加入到docker用户组中
  4. $ sudo usermod -aG docker [$USER 用户名]
复制代码
二、docker镜像【重要】

镜像是 Docker 的三大组件之一。
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
【重点】
docker镜像与docker容器的区别
​                镜像的一个实例称为容器。 你有一个镜像,这是你描述的一组图层。 如果你开始这个镜像,你有一个运行这个镜像的容器。 您可以拥有许多相同镜像的正在运行的容器。
  1. # 查看所有镜像
  2. docker images
  3. # 查看正在运行的容器
  4. docker ps -a
复制代码
获取镜像
  1. $ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  2. # 指定ubuntu版本下载
  3. docker pull ubuntu:18.04
  4. # 下载Ubuntu所有镜像
  5. docker pull -a ubuntu
  6. # 下载centos所有镜像
  7. docker pull -a centos
复制代码
docker交互式
  1. // 进入docker交互式 用法和linux命令类似
  2. docker run -it --rm ubuntu bash
复制代码
列出镜像
  1. docker image ls
复制代码
查看镜像文件大小
  1. docker system df
复制代码
删除本地镜像
  1. $ docker image rm [选项] <镜像1> [<镜像2> ...]
复制代码
使用commit理解镜像
docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成,
简单来说docker commit就是在原来的镜像上面进行copy然后形成新的镜像
  1. docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
  2. # 栗子:
  3. $ docker commit \
  4.     --author "Tao Wang <twang2218@gmail.com>" \
  5.     --message "修改了默认网页" \
  6.     webserver \
  7.     nginx:v2
  8. sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
复制代码
其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息可以省略留空。
三、使用dockerfile制作镜像

​                从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
创建dockerfile
  1. $ mkdir mynginx
  2. $ cd mynginx
  3. $ touch Dockerfile
  4. # 写入脚本
  5. FROM nginx // 指定镜像
  6. RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
复制代码
FROM命令
​                所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
RUN命令
​                RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种

  • shell 格式:RUN ,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
    1. # 执行脚本 单个
    2. RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    复制代码
  • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。
    1. FROM debian:stretch
    2. # 批量执行脚本
    3. RUN apt-get update
    4. RUN apt-get install -y gcc libc6-dev make wget
    5. RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    6. RUN mkdir -p /usr/src/redis
    7. RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
    8. RUN make -C /usr/src/redis
    9. RUN make -C /usr/src/redis install
    复制代码
exec格式虽然是批量执行脚本,但是上面脚本创建了七层镜像,是不合适的,那么正确的写法是: 使用&&符号进行连接,把原来创建七层镜像变成了一层
  1. FROM debian:stretch
  2. # '\'是shell脚本的末尾换行符
  3. RUN set -x; buildDeps='gcc libc6-dev make wget' \
  4.     && apt-get update \
  5.     && apt-get install -y $buildDeps \
  6.     && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
  7.     && mkdir -p /usr/src/redis \
  8.     && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
  9.     && make -C /usr/src/redis \
  10.     && make -C /usr/src/redis install \
  11.     && rm -rf /var/lib/apt/lists/* \
  12.     && rm redis.tar.gz \
  13.     && rm -r /usr/src/redis \
  14.     && apt-get purge -y --auto-remove $buildDeps
复制代码
3.1、dockerfile指令详解【重要】

FORM指令
  1. FROM 系统[:镜像版本号]
  2. # 指定基础镜像,也是必须的!!!
  3. FROM ubuntu
复制代码
EXPOSE指令
EXPOSE 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
  1. # 指定 80端口命令
  2. EXPOSE 80
复制代码
RUN指令
  1. # 指定下载安装包并更新软件包缓存
  2. RUN apt-get -qq update
复制代码
COPY复制文件
  1. COPY [--chown=<user>:<group>] <源路径>... <目标路径>
  2. # 复制/home/test文件夹下所有文件到当前目录
  3. COPY /home/test/** .
复制代码
CMD指令
CMD 指令的格式和 RUN 相似,也是两种格式:
  1. shell 格式:CMD <命令>
  2. # 栗子:
  3. CMD echo 'hello world!'
  4. CMD service nginx start
  5. exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
  6. 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
复制代码
ENV指令
格式有两种:
  1. ENV <key> <value>
  2. ENV <key1>=<value1> <key2>=<value2>...
  3. # 栗子:
  4. ENV VERSION=1.0 DEBUG=on \
  5.     NAME="Happy Feet"
复制代码
ADD复制文件(高级用法)
  1. # 与COPY指令类似,复制某个文件夹下所有文件到/mydir
  2. ADD --chown=55:mygroup files* /mydir/
  3. ADD --chown=bin files* /mydir/
  4. ADD --chown=1 files* /mydir/
  5. ADD --chown=10:11 files* /mydir/
复制代码
总结:
  1. # FROM:作为基础镜像
  2. FROM ubuntu
  3. # 使用RUN指令下载安装包等等,连接使用&&
  4. RUN apt-get -qq update \
  5. && COPY /home/test/** . \
  6. # EXPOST 8080
  7. && RUN  echo 'hello, dockerfile'
复制代码
那么镜像制作完成了,就应该进行构建镜像
  1. # docker build -t=【tag信息】 【dockerfile路径】
  2. docker build [选项] <上下文路径/URL/->
  3. # 栗子:
  4. docker build -t nginx:v3 .
复制代码
四、操作容器

新建并启动一个容器
  1. # 使用docker run命令携带脚本
  2. $ docker run ubuntu /bin/echo 'Hello world'
  3. Hello world
复制代码
查看正在运行的docker容器信息
  1. # 查看容器信息
  2. docker container ls
复制代码
查看容器日志【重要】
  1. # 查看正在运行的容器
  2. docker ps -a
  3. # 拿到对应的容器id,使用docker logs 查看日志
  4. docker container logs [container ID or NAMES]
  5. # 查看实时日志
  6. docker logs -f [container ID or NAMES]
复制代码
操作容器(停止、启动、重启)
  1. # 1.查看正在运行的容器
  2. docker ps -a
  3. # 2.停止正在运行的容器
  4. docker container stop [容器id]
  5. # 3.启动正在运行的容器
  6. docker container start [容器id]
  7. # 4.重启正在运行的容器
  8. docker container restart [容器id]
复制代码
进入容器
  1. # 命令
  2. docker attach [容器id] / docker exec [容器id]
  3. # 进入容器并启用伪装终端
  4. docker exec -it [容器id] bash
复制代码
导入导出容器
  1. # 1.查看容器
  2. docker container ls -a
  3. # 2.导出容器到本地文件
  4. docker export [容器id] > ubuntu.tar
  5. # 3.导入容器
  6. docker import [目录/http链接]
复制代码
删除容器
  1. # 1.查看所有容器
  2. docker container ls
  3. # 2.停止对应容器
  4. docker container stop [容器id]
  5. # 3. 删除对应容器
  6. docker container rm [容器id / 容器名]
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表