乐趣区

关于docker:docker基础使用命令手册和操作附带说明

装置根本配置

装置

办法 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 级)的区别

exportimport 导出的是一个容器的 快照 , 不是镜像自身, 也就是说没有 layer。
你的 dockerfile 里的 workdir, entrypoint 之类的所有货色都会失落,commit 过的话也会失落。快照 文件将抛弃所有的历史记录和元数据信息(即仅保留容器过后的快照状态),而镜像存储文件将保留残缺记录,体积也更大。而 saveload保留的是镜像(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
退出移动版