装置根本配置
装置
办法 1 - 脚本装置
在测试或开发环境中 Docker 官网为了简化装置流程,提供了一套便捷的装置脚本,CentOS
零碎上能够应用这套脚本装置:
# 在理论过程中 get-docker.sh 文件可能 curl 很慢。能够浏览器间接关上 get.docker.com,将期复制下来,再创立 get-docker.sh,将复制的内容保留进去。$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
办法 2 - 一般命令行装置
# 1、更新 update 到最新的版本
~ yum update
# 2、卸载老版本 docker
~ yum remove docker docker-common docker-selinux docker-engine
# 3、装置须要的软件包
~ yum install -y yum-utils device-mapper-persistent-data lvm2
# 4、设置 yum 源
~ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 5、查看 docker 版本
~ yum list docker-ce --showduplicates|sort -r
# 6、装置 docker
~ yum install docker-ce-18.03.1.ce -y
# 7、启动 docker
~ systemctl start docker
# 8、退出开机自启
~ systemctl enable docker
# 9、配置国内镜像,集体感觉国内镜像用专用的阿里云比拟好。可看下方阿里云镜像源获取
~ vi /etc/docker/daemon.json
{"registry-mirrors": ["https://cr.console.aliyun.com/"]
}
~ ps -aux | grep docker
设置阿里云镜像
多说无益,间接截图
dockerhub 账户关联
这个有点相似于 composer 的仓库地址就是用来存储咱们散会人员的镜像地址的;
官网:https://hub.docker.com
本人注册一个账号,这个过程我就跳过。
~ docker login
Username: haokeed(对应 dockerhub 的账号)
Password:
Login Successded
# 异样!# 在下面执行的代码可能呈现如下异样 rror response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifest
# 这个问题的异样次要是
# 1. 解析 ip 不可用
# 2. 是因为 dns 域名没有解析的起因;# 解决:~ yum install bind-utils
~ dig @114.114.114.114 registry-1.docker.io
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @114.114.114.114 registry-1.docker.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57840
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;registry-1.docker.io. IN A
;; ANSWER SECTION:
registry-1.docker.io. 33 IN A 34.205.88.205
registry-1.docker.io. 33 IN A 35.169.133.189
registry-1.docker.io. 33 IN A 34.202.247.184
registry-1.docker.io. 33 IN A 3.224.11.4
registry-1.docker.io. 33 IN A 3.82.34.201
registry-1.docker.io. 33 IN A 34.195.36.112
registry-1.docker.io. 33 IN A 3.221.133.86
registry-1.docker.io. 33 IN A 3.224.75.242
;; Query time: 26 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 三 4 月 22 04:41:31 CST 2020
;; MSG SIZE rcvd: 177
~ vi /etc/hosts
34.205.88.205 registry-1.docker.io
~ systemctl restart docker
登入胜利之后,应用 push 命令就能够上传镜像,如果不指定 tag 则本地的镜像都会上传。如下实例:
留神 docker hub 的 push 要求是如下格局
docker push 注册名 / 镜像名:tag
能够在 https://hub.docker.com 的本人 …,本人下来看吧。
镜像和容器最常用命令
镜像
# 查看现有的镜像列表
docker images
# 下载镜像
# 这里下载了 nginx
docker pull nginx
# 删除镜像
## 指定删除
docker rmi 镜像 id(image id)
## 强制删除
docker rmi -f 镜像 id(image id)
## 删除所有镜像
docker rmi $(docker images -q)
# 依据 dockerfile 构建镜像
# redis5:构建的镜像名称
# ".":构建的 dockerfile 文件目录在当前目录下
docker build -t redis5 .
# 执行 tag 批改
# 将原来构建镜像名为 redis5 的批改为 haokeed/redis5,并打上 tag 为 v1
docker tag redis5 haokeed/redis5:v1
# 上传 docker 镜像到 dockerhub。执行该命令时,集体倡议当初 dockerhub 上建设对应的仓库。建设好后能够在任何其余中央 docker pull haokeed/redis5:v1
docker push haokeed/redis5:v1
容器
容器类型
- 交互型容器:运行在前台,通常会制订有交互的控制台,能够给容器输出,也能够失去容器的输入。创立该日期的终端被敞开,在容器外部应用 exit 命令或者调用 docker stop、docker kill 命令后,容器会进行运行。
- 后盾型容器:运行在后盾,创立启动之后就与终端无关。即使终端敞开了,改后盾容器也仍然存在,只有执行 docker stop 或者 docker kill 命令
时候才可能使容器变成进行状态
# 启动容器
docker start 容器名
# 删除容器
docker rm 容器名
# 列出正在运行的容器
docker ps
# 显示所有的容器,包含未运行的
docker ps -a
# 进行所容器
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
# 基于镜像与构建容器
docker run -itd --name 容器名称(自定义) 镜像名称: 标识
# docker run 执行语法和参数阐明
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS 阐明:-a stdin: 指定规范输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;-d: 后盾运行容器,并返回容器 ID;-i: 以交互模式运行容器,通常与 -t 同时应用;-t: 为容器重新分配一个伪输出终端,通常与 -i 同时应用;--name="nginx-lb": 为容器指定一个名称;--dns 8.8.8.8: 指定容器应用的 DNS 服务器,默认和宿主统一;--dns-search example.com: 指定容器 DNS 搜寻域名,默认和宿主统一;-h "mars": 指定容器的 hostname;-e username="ritchie": 设置环境变量;--env-file=[]: 从指定文件读入环境变量;--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定 CPU 运行;-m : 设置容器应用内存最大值;--net="bridge": 指定容器的网络连接类型,反对 bridge/host/none/container: 四种类型;--link=[]: 增加链接到另一个容器;--expose=[]: 凋谢一个端口或一组端口;# 进入容器
# 这里示意进入容器名称为 reids5 的容器,并且以 bash 命令行模式进入
docker exec -it redis5 bash
导出与导入
容器的导出与导入
docker 的风行与它对容器的易分享和易移植密不可分。用户不仅能够把容器提交到公共服务器上,还能够将容器导出到本地文件系统中。同样咱们也能够讲导出的
容器从新导入到 docker 运行环境中。docker 的导入和导出别离由 import 命令和 export 命令实现。
# 导出: 将容器名称为 redis5 的导出, 导出的文件为当前目录下的 redis.tar,导出的是单个的 tar 文件
# docker export 命令会把容器的文件系统以 tar 包的格局导出到规范输入,咱们将其重定位到指标文件 name.tar。将容器保留到本地文件也算是其长久化形式的一种。docker export redis5 > redis5.tar
# 容器的导入: 咱们能够应用 docker import 命令,导人一个本地的 tar 包作为镜像。# 这里将 redis5.tar 文件导出为 redis5:v1 镜像。而后就能够通过 docker run 间接构建镜像了。docker import redis5.tar redis5:v1
镜像的导出与导入
# 将指定镜像保留成 tar 归档文件
# docker save [OPTIONS] IMAGE [IMAGE...]
# options 阐明
# -o : 输入到的文件。# haokeed/redis5:v1 导出为 redis5.tar 文件
docker save -o redis5.tar haokeed/redis5:v1
# 将 redis5.tar 导入镜像
docker load<redis5.tar
save/load(image 级)和 export/import(container 级)的区别
export
和 import
导出的是一个容器的 快照
, 不是镜像自身, 也就是说没有 layer。
你的 dockerfile 里的 workdir, entrypoint 之类的所有货色都会失落,commit 过的话也会失落。快照
文件将抛弃所有的历史记录和元数据信息(即仅保留容器过后的快照状态),而镜像存储文件将保留残缺记录,体积也更大。而 save
和load
保留的是镜像(image), 载入的是镜像包。
- docker save 保留的是镜像(image),docker export 保留的是容器(container);
- docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会复原为镜像;
- docker load 不能对载入的镜像重命名,而 docker import 能够为镜像指定新名称。
Dockerfile 语法
dockerfile 文件样例:
FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y ; \
yum -y install gcc automake autoconf libtool make wget epel-release gcc-c++;
RUN mkdir -p /usr/src/redis; \
wget https://github.com/antirez/redis/archive/5.0.7.tar.gz; \
tar -zxvf 5.0.7.tar.gz -C /usr/src/redis; \
rm -rf 5.0.7.tar.gz; \
cd /usr/src/redis/redis-5.0.7 && make && make PREFIX=/usr/local/redis install;
# 构建命令
docker build -t 名称 .
# 参数阐明
Usage:docker build [OPTIONS] PATH | URL | -
OPTIONS:-t,--tag list #构建后的镜像名称
-f,--file string #指定 Dockerfiile 文件地位
# 示例:1 docker build .
2 docker build -t redis:v1 .
3 docker build -t redis:v2 -f /path/Dockerfile /path
# 个别罕用第 2 种形式构建,咱们在构建时都会切换到 Dockerfile 文件的目录下进行构建,所以不须要指定 - f 参
指令参数阐明
- FROM:指定根底镜像
指定待扩大的父级镜像。除了正文外,在文件结尾必须是一一个 FROM 指令,接下来白指令便在这个父级镜像的环境中运行,直到遇到下一一个 FROM 指令。通过增加多个 FROM 命令能够在同一个 Dockerfile 文件中创立多个镜像。
所谓定制镜像,那肯定是以一个镜像为根底,在其上进行定制。就像咱们之前运行了一个 redis 镜像的容器,再进行批改一样,根底镜像是必须指定的。而 FROM 就是指定根底镜像,因而一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。 -
RUN:执行命令
RUN 指令是用来执行命令行命令的。
格局:RUN \<command\> (相似 /bin/sh -cshell 格局) RUN ["executable", "param1", "param2"] (exec 格局) # 相似 shell 脚本格调的:FROM alpine RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers RUN mkdir -p /usr/src/redis RUN cd /usr/src/redis RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz" RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
- MAINTAINER:用来申明创立的镜像的作者信息。
格局为 MAINTAINER user_name user_email,指定维护者信息。 - EXPOSE:用来指明容器内过程对外开放的端口,多个端口之间应用空替隔力。运行容器通过参数 -p(大写)即可将 EXPOSE 里所指定的端口映射到主机上另外的随机端口,容器;或主机就能够通过映射后的端口与此容器通信。同时,咱们也能够通过 -p (小写)参数将 dockerfile 中 EXPOSE 中没有列出的端口设置成公开的。
- ADD:向新镜像中增加文件,这个文件能够是一个主机文件,也能够是一个网络文件,也能够是一个文件夹
- ENV:设置容器运行的环境变量。在运行容器的时候,通过 - e 参数能够批改这个环境变量值,也能够增加新的环境变量。
格局为:EVN key value。用于指定环境变量,这些环境变量,后续能够被 RUN 指令应用,容器运行起来之后,也能够在容器中获取这些环境变量。
例如:
ENV word hello
RUN echo $word