

docker实战 - 阿辉ya
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.

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
就是指定 基础镜像,因此一个 Dockerfile
中 FROM
是必备的指令,并且必须是第一条指令。
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__
Recommend
-
75
本文重点介绍jenkins以及让jenkins如何实现在docker容器中运行。jenkins和docker私有仓库又是怎么结合的。docker说明及安装和git说明及安装在本文中不会特别详细的介绍。 并且,在本文中不着重介绍原理性的东西,比如不会介绍什么是持续集成、持续构建等等。本文...
-
51
-
45
Dockerfile介绍Dockerfile是由一组指令组成的文件,每条指令对应linux中一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。Dockerfile大致结构:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。每行支持一条指令,每条指令可以携带多个参...
-
35
Marathon+Mesos+Docker实战ApacheMesos概述ApacheMesos是一款基于多资源调度的开源集群管理套件,使容错和分布式系统更加容易使用实现,采用Master/Slave结构简化设计,将Master尽可能轻量级,进保存了MesosSlave的状态信息常见集群管理工具工具特点优势ApacheMeso...
-
3
出门,和阿辉约吃饭,把理头发也理了 1天前 185℃ 0赞 ...
-
5
失眠,状态差,鸽了阿辉 by 叶开楗 · 2021-11-21 · 6433 次阅读 昨天晚上和小赵同学聊天到一半特别困就跟他说我要睡一会儿了差不多...
-
4
争吵,跑路,阿辉,睡地板 by 叶开楗 · 2021-11-25 · 2273 次阅读 昨天晚上还是去买了一点卤味,很久没去了但是老板和老板娘都还记...
-
4
和阿辉去拿枇杷??? by 叶开楗 · 2022-04-03 20:16:05 · 8520 次阅读 早上八点多我收到了阿辉的微信消息,阿辉问我起床了没有要不要去吃...
-
4
被阿辉吐槽最近不知道什么情况阿辉老吐槽我,不知道是不是因为不经常跟他爬山导致的,我毕竟喜欢宅啊ε=(´ο`*)))唉。前段时间我和阿辉一起爬山让他帮我拍照,我看了说阿辉拍的不好看,阿辉说你不要笑笑起来都是皱纹。前几天又一起爬山不...
-
8
Arthas基本应用 一、Arthas作用 什么是Arthas呢? Arthas 是一款阿里推出的线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK