3

docker实战 - 阿辉ya

 1 year ago
source link: https://www.cnblogs.com/curryAhui/p/17173519.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

docker实战笔记

一、安装docker

下面以ubuntu系统举例:

卸载已有的旧版本docker

$ sudo apt-get remove docker \
               docker-engine \
               docker.io

使用apt安装最新版docker

$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

更新apt软件包缓存

$ sudo apt-get update

# 安装docker-ce
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

启动docker

# 使用系统命令启动docker
$ sudo systemctl enable docker
$ sudo systemctl start docker

建立docker用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组

# 建立docker用户组
$ sudo groupadd docker

# 将用户加入到docker用户组中
$ sudo usermod -aG docker [$USER 用户名]

二、docker镜像【重要】

镜像是 Docker 的三大组件之一。

Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。

【重点】

docker镜像与docker容器的区别

镜像的一个实例称为容器。 你有一个镜像,这是你描述的一组图层。 如果你开始这个镜像,你有一个运行这个镜像的容器。 您可以拥有许多相同镜像的正在运行的容器。

# 查看所有镜像
docker images

# 查看正在运行的容器
docker ps -a 
$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
# 指定ubuntu版本下载
docker pull ubuntu:18.04
# 下载Ubuntu所有镜像
docker pull -a ubuntu 
# 下载centos所有镜像
docker pull -a centos 

docker交互式

// 进入docker交互式 用法和linux命令类似
docker run -it --rm ubuntu bash
docker image ls

查看镜像文件大小

docker system df

删除本地镜像

$ docker image rm [选项] <镜像1> [<镜像2> ...]

使用commit理解镜像

docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成,

简单来说docker commit就是在原来的镜像上面进行copy然后形成新的镜像

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

# 栗子:
$ docker commit \
    --author "Tao Wang <[email protected]>" \
    --message "修改了默认网页" \
    webserver \
    nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214

其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息可以省略留空。

三、使用dockerfile制作镜像

​ 从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

创建dockerfile

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

# 写入脚本
FROM nginx // 指定镜像
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

FROM命令

​ 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 DockerfileFROM 是必备的指令,并且必须是第一条指令。

RUN命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种

  • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。

    # 执行脚本 单个
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    
  • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。

    FROM debian:stretch
    # 批量执行脚本
    RUN apt-get update
    RUN apt-get install -y gcc libc6-dev make wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN mkdir -p /usr/src/redis
    RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
    RUN make -C /usr/src/redis
    RUN make -C /usr/src/redis install
    

exec格式虽然是批量执行脚本,但是上面脚本创建了七层镜像,是不合适的,那么正确的写法是: 使用&&符号进行连接,把原来创建七层镜像变成了一层

FROM debian:stretch
# '\'是shell脚本的末尾换行符
RUN set -x; buildDeps='gcc libc6-dev make wget' \
    && apt-get update \
    && apt-get install -y $buildDeps \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && mkdir -p /usr/src/redis \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -rf /var/lib/apt/lists/* \
    && rm redis.tar.gz \
    && rm -r /usr/src/redis \
    && apt-get purge -y --auto-remove $buildDeps

3.1、dockerfile指令详解【重要】

FORM指令

FROM 系统[:镜像版本号]
# 指定基础镜像,也是必须的!!!
FROM ubuntu

EXPOSE指令

EXPOSE 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

# 指定 80端口命令
EXPOSE 80

RUN指令

# 指定下载安装包并更新软件包缓存
RUN apt-get -qq update

COPY复制文件

COPY [--chown=<user>:<group>] <源路径>... <目标路径>
# 复制/home/test文件夹下所有文件到当前目录
COPY /home/test/** .

CMD指令

CMD 指令的格式和 RUN 相似,也是两种格式:

shell 格式:CMD <命令>
# 栗子:
CMD echo 'hello world!'
CMD service nginx start

exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

ENV指令

格式有两种:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

# 栗子:
ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

ADD复制文件(高级用法)

# 与COPY指令类似,复制某个文件夹下所有文件到/mydir
ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/

总结:

# FROM:作为基础镜像
FROM ubuntu
# 使用RUN指令下载安装包等等,连接使用&&
RUN apt-get -qq update \
&& COPY /home/test/** . \
# EXPOST 8080
&& RUN  echo 'hello, dockerfile'

那么镜像制作完成了,就应该进行构建镜像

# docker build -t=【tag信息】 【dockerfile路径】
docker build [选项] <上下文路径/URL/->
# 栗子:
docker build -t nginx:v3 .

四、操作容器

新建并启动一个容器

# 使用docker run命令携带脚本
$ docker run ubuntu /bin/echo 'Hello world'
Hello world

查看正在运行的docker容器信息

# 查看容器信息
docker container ls

查看容器日志【重要】

# 查看正在运行的容器
docker ps -a
# 拿到对应的容器id,使用docker logs 查看日志
docker container logs [container ID or NAMES]
# 查看实时日志
docker logs -f [container ID or NAMES]

操作容器(停止、启动、重启)

# 1.查看正在运行的容器
docker ps -a

# 2.停止正在运行的容器
docker container stop [容器id]

# 3.启动正在运行的容器
docker container start [容器id]

# 4.重启正在运行的容器
docker container restart [容器id]
# 命令
docker attach [容器id] / docker exec [容器id]

# 进入容器并启用伪装终端
docker exec -it [容器id] bash

导入导出容器

# 1.查看容器
docker container ls -a

# 2.导出容器到本地文件
docker export [容器id] > ubuntu.tar

# 3.导入容器
docker import [目录/http链接]
# 1.查看所有容器
docker container ls

# 2.停止对应容器
docker container stop [容器id]

# 3. 删除对应容器
docker container rm [容器id / 容器名]

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK