前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker 安装和学习笔记

docker 安装和学习笔记

作者头像
solate
发布2019-07-22 17:53:17
1.4K0
发布2019-07-22 17:53:17
举报
文章被收录于专栏:solate 杂货铺solate 杂货铺

VMware 安装 CentOS 7

  1. 安装VMware
  2. 下载CentOS 7, 安装
  3. 配置网络

配置静态网络

  1. 进入/etc/sysconfig/network-scripts目录
  2. 找到网卡的配置文件:名字类似于ifcfg-enp03
  3. 修改配置文件

修改下面内容,如果没有就添加

代码语言:javascript
复制
BOOTPROTO="static" #dhcp改为static
ONBOOT="yes" #开机启用本配置
IPADDR=192.168.7.106 #静态IP
GATEWAY=192.168.7.1 #默认网关
NETMASK=255.255.255.0 #子网掩码
DNS1=192.168.7.1 #DNS 配置

修改后的文件

代码语言:javascript
复制
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=184d6253-b749-4f1e-8521-2fc0414a37e8
DEVICE=ens33
ONBOOT=yes
BROADCAST=192.168.106.255
DNS1=192.168.106.1
IPADDR=192.168.106.101
NETMASK=255.255.255.255
GATEWAY=192.168.106.1

Centos 7 学习之静态IP设置

使用的时候需要使用root用户进行操作,不然会出现错误

Docker

Docker 主要分成3个大部分

  1. 镜像(Image)
  2. 容器(Container)
  3. 仓库(Repository)

安装

使用root账户

  1. 安装:yum install -y docker
  2. 启动: sudo service docker start
  3. 测试: sudo docker run hello-world
  4. 设置开机启动:systemctl enable docker
  5. 将制定用户添加到用户组:usermod -aG docker your_username

centos7安装docker并设置开机启动

镜像

层(Layer)其实是AUFS(Advanced Union File System, 一种联合文件系统)中的概念,是实现增量保存于更新的基础。

镜像ID:唯一标示了镜像 TAG : 用于标示来自同一个仓库的不同镜像。

获取镜像
代码语言:javascript
复制
docker pull NAME[:TAG]
查看镜像信息
代码语言:javascript
复制
docker images
本地镜像添加新的标签
代码语言:javascript
复制
docker tag

例如:
docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
获取镜像的详细信息

使用inspect + image id

代码语言:javascript
复制
docker inspect 48b5124b2768

使用 -f 来获取其中一项
docker inspect -f {{.Architecture}} 48b5124b2768
搜索镜像

搜索远程仓库中共享的镜像,默认搜索Docker Hub 官方仓库的镜像

代码语言:javascript
复制
docker search TERM

-f,  --filter=stars=0 指定仅显示评价为指定星级以上的镜像
删除镜像

如果该镜像有多个标签只会删除指定标签,只有一个时会删除所有AUFS层。可以使用名字+版本的方式,也可以使用ImageId(或可识别部分)进行删除,当有容器存在的时候,镜像文件无法删除。

代码语言:javascript
复制
docker rmi IMAGE[IMAGE...]

强制删除使用 -f 参数
docker rmi -f ubuntu
但是这样会存在遗留镜像,正确做法应该是先删除容器再删除镜像,这样会正确打印删除各层信息。
创建镜像
  1. 基于已有镜像创建
  2. 基于本地模板导入
  3. 基于Dockerfile创建
基于已有镜像的容器创建

使用Docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]命令

选项

  1. -a, --author="" 作者信息
  2. -m, --message="" 提交信息
  3. -p, --pause=true 提交时暂停容器运行
代码语言:javascript
复制
$ sudo docker run -ti ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit

容器id为a925cb40b3f0

然后提交为一个新的镜像
$ sudo docker commit -m "Added a new file" -a "Docker NewBee" a925cb40b3f0 test

查看本地镜像列表可以看到新创建的镜像
$ sudo docker images
基于本地模板导入

下载压缩包,然后用命令导入

代码语言:javascript
复制
$ sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

然后查询
$ sudo docker images
存出镜像
代码语言:javascript
复制
docker save

sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
载入镜像
代码语言:javascript
复制
sudo docker load --input ubuntu_14.04.tar
或
sudo docker load < ubuntu_14.04.tar
上传镜像

默认上传到DockerHub 官方仓库,需要登录,命令格式。

例如user用户上传本地test:latest镜像,可以先添加标签user/test:latest 然后使用docker push

代码语言:javascript
复制
docker push NAME[:TAG]

sudo docker tag test:lastest user/test:latest
sudo docker push user/test:latest
然后输入账号密码

容器

容器是镜像的一个运行实例,带有可写的文件层,镜像创建后不可写。

容器是直接提供应用服务的组件,也是Docker 实现快速的启停和高效服务性能的基础。

查看容器
代码语言:javascript
复制
docker ps -a
创建容器

使用docker create 新建的容器处于停止状态可以使用 docker start启动

代码语言:javascript
复制
创建容器
docker create

创建:
docker create -lt ubuntu:latest
查询
docker ps -a
启动容器
  1. 基于镜像新建一个容器并启动, 使用 docker run 等价于docker create,再执行docker start
  2. 将在终止状态(stopped)的容器重新启动, docker start
代码语言:javascript
复制
docker run ubuntu /bin/echo 'hello world'

docker run 命令启动时,Docker后台运行标准操作

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  2. 利用镜像创建并启动一个容器
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  5. 从地址池配置一个ip地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕容器被终止

docker的四种网络模式

代码语言:javascript
复制
-t 参数让Docker 分配一个伪终端,并绑定到容器的标准输入
-i 让容器的标准输入保持打开


docker run -t -i ubuntu:14.04 /bin/bash

使用 Ctrl+D 或 exit命令退出

代码语言:javascript
复制
-d Docker容器再后台已守护态形式运行

docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

返回一个唯一Id 可以使用 docker ps 查看容器信息

docker ps

获取容器的输出信息 docker logs ID

docker logs 868e548cd38
终止容器
代码语言:javascript
复制
docker stop [-t|--time[=10]] ID
  1. 向容器发送SIGTERM信号
  2. 等待一段时间(默认10秒)
  3. 发送SIGKILL信号终止容器

docker 容器中指定的应用终止时,容器也自动终止。

代码语言:javascript
复制
docker kill 命令会直接发送SIGKILL信号来强行终止容器

查看终止状态的容器ID信息

代码语言:javascript
复制
docker ps -a -q

处于终止状态的容器可以使用docker start 命令来重新启动。

进入容器

在使用-d 参数容器进入后台,用户无法看到容器中的信息,某些时候需要进入容器进行操作。

  1. docker attach
  2. docker exec (推荐)
  3. nsenter 工具
代码语言:javascript
复制
后台启动ubuntu( -it 和 /bin/sh 成对出现进行操作)
docker run -itd ubuntu /bin/sh

查看docker进程
docker ps

attach进入ubuntu,
sudo docker attach id/name


exec 进入ubuntu
docker exec -ti id/name  /bin/bash

nsenter 工具在util-linux包2.23版本之后包含。如果没有安装如下:

代码语言:javascript
复制
输入 https://www.kernel.org/pub/linux/utils/util-linux/ 可以选择版本

cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.tar.gz  | tar -zxf-; cd util-linux-2.29;
./configure --without-ncurses
make nsenter && sudo cp nsenter /usr/local/bin

为了使用nsenter连接到容器,还需要找到容器的进程的pid

代码语言:javascript
复制
PID=$(docker inspect --format "{{.State.Pid}}" <container id>)

通过pid, 连接容器
nsenter --target $PID --mount --uts --ipc --net --pid

完整使用例子

代码语言:javascript
复制
//启动ubuntu
docker run -idt ubuntu /bin/bash
//查询docker容器id
docker ps
//查询pid并将值赋给PID变量
PID=$(docker inspect --format "{{.State.Pid}}" a86ac85eaa03)
//打印pid
echo $PID
//使用nsenter命令,--target后跟查询出的PID值
nsenter --target 2842 --mount --uts --ipc --net --pid
删除容器
代码语言:javascript
复制
-f, --force=false 强制终止并删除一个运行中的容器
-l, --link=false 删除容器的连接,但保留容器
-v, --volumes=false 删除容器挂载的数据卷

docker rm [OPTIONS] CONTAINER [CONTAINER...]

docker rm ContainerId
导出容器

导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。

代码语言:javascript
复制
docker export CONTAINER

具体操作过程

代码语言:javascript
复制
//查看当前容器
docker ps -a
导出ce5542容器到test_for_run.tar 文件
docker export ce5542 > test_for_run.tar
导入容器

导出的文件可以使用命令导入,成为镜像

代码语言:javascript
复制
docker import

具体操作过程

代码语言:javascript
复制
cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0

docker load命令来导入镜像存储文件到本地的镜像库,docker import导入一个容器快照到本地镜像库。

区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(既仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也大。

此外:从容器快照文件导入时可以重新指定标签等元数据信息。

仓库

仓库(Respository)是集中存放镜像的地方。

注册服务器(Registry):存放仓库的具体服务器

例如仓库地址 dl.dockerpool.com/ubuntu来说, dl.dockerpool.com是注册服务器地址, ubuntu是仓库名

Docker官方公共仓库https://hub.doker.com

Docker Pool 国内专业的Docker技术社区,也提供镜像http://dockerpool.com

登录
代码语言:javascript
复制
docker login 命令来输入用户名、密码和邮箱来完成注册和登录

注册成功后本地用户目录 .dockercfg中将保存用户的认证信息

查询

查询官方镜像仓库

代码语言:javascript
复制
-s N 参数可以指定仅显示评价为N星以上的镜像

docker search

可镜像资源分为两种

  1. 类似centos这样的基础镜像, 称为基础或根镜像。这些镜像由Docker公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字
  2. 类似tianon/centos镜像,他由DockerHub的用户tiannon创建并维护,带有用户名前缀,表明是某用户的某仓库。
下载

下载官方镜像

代码语言:javascript
复制
docker pull

在docker pool 下载的时候需要添加注册服务器的具体地址

代码语言:javascript
复制
docker pull dl.dockerpool.com:5000/ubuntu:12.04

然后可以使用docker tag将这个标签更改成和官方一致
自动创建

自动创建(Automated Builds) 功能对于需要经常升级镜像内程序来说十分便捷。自动创建功能使用户通过Docker Hub指定跟踪一个目标网站(目前支持GitHub或BitBucket)上的项目,一旦项目发现新的提交,则自动执行创建。

  1. 创建并登陆Docker Hub,以及目标网站; * 在目标网站中连接账户到Docker Hub
  2. 在Docker Hub 中配置一个自动创建
  3. 选取一个目标网站中的项目(需要包含Dockerfile)和分支
  4. 指定Dockerfile 的位置,并提交创建

之后可以在Docker Hub 的自动创建页面跟踪每次创建的状态

创建私有库
使用registry 镜像创建私有仓库

可以使用官方提供的Registry 镜像来简单搭建一套本地私有仓库环境。

自动下载并启动一个registry容器,创建本地的私有仓库服务

代码语言:javascript
复制
docker run -d -p 5000:5000 registry

默认情况会将仓库创建在容器的/tmp/registry目录下。 可以通过-v参数来将镜像文件存放在本地的指定路径上

代码语言:javascript
复制
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

此时本地将启动一个私有仓库服务,监听端口为5000。

管理私有仓库镜像

本地地址为:10.0.2.2:5000 。

上传

代码语言:javascript
复制
//查看已有镜像
docker images

//docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
docker tag ubuntu:14.04 10.0.2.2:5000/test

//上传标记的镜像
docker push 10.0.2.2:5000/test

//curl 查看本地仓库中的镜像
curl http://10.0.2.2:5000/v1/search

结果看到{{"description":"", "name": "library/test"}} 就上传成功了

下载:任意可以访问到10.0.2.2地址的机器

代码语言:javascript
复制
docker pull 10.0.2.2:5000/test

下载后可以使用docker tag 修改为通用标签

数据管理

用户使用Docker的过程中,往往需要能查看容器内应用产生的数据, 这必然涉及到容器的数据管理操作

数据卷

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供多种有用特效

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用

类似于linux下对目录或文件进行mount操作

在容器内创建一个数据卷

在docker run 命令的时候,使用-v标记可以在容器内创建一个数据卷。多次使用-v标记可以创建多个数据卷。

使用training/webapp镜像创建一个web容器,并创建一个数据卷挂载到容器/webapp目录:

代码语言:javascript
复制
-P 允许外部访问容器需要暴露的端口

docker run -d -P --name web -v /webapp training/webapp python app.py


//注意:这个命令没有运行成功,网上查到的也不行,后续进行修改。
挂载一个主机目录作为数据卷

挂载主机src/webapp目录到容器的/opt/webapp目录

代码语言:javascript
复制
 docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

//ro指定为只读
 docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

用户可以放置一些程序或数据到本地目录然后在容器内运行和使用。

注意:本地目录必须是绝对路径,如果目录不存在,docker 会自动创建

docker 默认权限是读写(rw),用户可以通过ro指定为只读。

挂载一个本地主机文件作为数据卷

可以从主机挂载单个文件到容器中作为数据卷

代码语言:javascript
复制
//记录容器输入过的命令历史
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

注意:直接挂载文件到容器使用vi或者sed --in-place的时候可能会导致inode改变,会导致错误。推荐方式是直接挂载文件所在目录

数据卷容器

用户需要在容器之间共享一些持续更新的数据,最简单的方法是使用数据卷容器。

其实就是一个普通容器,专门用它来提供数据卷供其他容器挂载。

代码语言:javascript
复制
//创建一个dbdata数据卷容器, 并在其中创建一个数据卷挂载到/dbdata
docker run -it -v /dbdata --name dbdata ubuntu /bin/bash

//使用--volumes-from 来挂载dbdata容器中的数据卷例如创建db1和db2两个容器并从dbdata容器挂载数据卷
docker run -it --volumes-from dbdata --name db1 ubuntu /bin/bash
docker run -it --volumes-from dbdata --name db2 ubuntu /bin/bash

//现在这3个容器都挂载到相同的/dbdata 目录 三个容器任何一方在该目录下的写入,其他容器都可以看到
cd /dbdata
touch test
ls

//其他2个里就可以看到创建的test了

使用--volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。

如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联容器

使用数据卷容器迁移数据

可以利用数据卷容器对其中的数据卷进行备份、恢复、以实现数据的迁移。

备份
代码语言:javascript
复制
//备份dbdata数据卷容器内的数据卷, (书上 $(pwd):/backup 如果是root运行会把root挂载上去)
docker run -it --volumes-from dbdata -v /dbdata:/backup --name worker ubuntu /bin/bash
tar cvf /backup/backup.tar /dbdata
  1. 创建容器worker
  2. 挂载容器到dbdata (--volumes-from)
  3. 使用-v $(pwd):/backup 参数来挂载本地的当前目录(/dbdata)到worker容器的/backup 目录
  4. worker 容器启动后,来将 /dbdata下的内容备份为/backup/backup.tar

注意:这里可能会出现没有权限的情况网上查到的解决方案是:(详细的后面更明白的时候补充)

代码语言:javascript
复制
//su -c "setenforce 0" 这个不起作用

//添加 --privileged=true 这个是可以的
docker run  --privileged=true -it --volumes-from dbdata -v /dbdata:/backup --name worker ubuntu /bin/bash
恢复
代码语言:javascript
复制
//创建一个带有数据卷的容器dbdata2
docker run -it -v /dbdata --name dbdata2 ubuntu /bin/bash

//创建新容器挂载dbdata2 并使用untar 解压备份文件到所挂载的容器卷
docker run --volumes-from dbdata2 -v /dbdata:backup busybox tar xvf /backup/backup.tar /bin/bash

网络基础配置

端口映射实现访问容器

启动容器的时候如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

参数来指定端口映射:

  1. 使用 "-P", Docker 会随机映射一个 49000~49900的端口至容器内部开发的网络端口
  2. 使用 "-p", -p(小写的)可以指定要映射的端口,一个指定端口上只可以绑定一个容器。支持格式 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
从外部访问容器应用
代码语言:javascript
复制
//启动容器
docker run -d -P training/webapp python app.py
//查看容器的情况,可以看到端口,如49115
docker ps -l

访问宿主机的49115端口即可访问容器内Web应用提供的界面。

可以通过docker logs查看应用的信息

代码语言:javascript
复制
docker logs -f nostalgic_morse


docker logs daemon_logs 查看容器日志 
-f:表示查看实时日志 
-t:表示查看日志产生的日期 
–tail=n:表示查看从尾部看的n条日志
映射所有接口地址
代码语言:javascript
复制
//hostPort:containerPort 将本地的5000端口映射到容器的5000端口
docker run -d -p 5000:5000 training/webapp python app.py

//默认会绑定本地所有接口上的所有地址,多次-p可以绑定多个端口
docker run -d 5000:5000 -p 3000:80 training/webapp python app.py
映射到指定地址的指定端口
代码语言:javascript
复制
// ip:hostPort:containerPort 映射特定地址
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
代码语言:javascript
复制
//使用ip::containerPort 绑定localhost的任意端口到容器的5000端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
标记udp端口
代码语言:javascript
复制
//可以使用udp 标记来指定udp端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
代码语言:javascript
复制
//使用 docker port 来查看端口的配置
docker port nostalgic_more 5000

容器又自己内部网络和ip地址,使用docker inspect + 容器id 可以获取所有的变量值

容器间通信

容器的连接系统除端口映射另一种与容器中应用进行交互的方式。

在源和接收容器间建立一个隧道,接收容器可以看到源容器指定的信息。

自定义容器命名

连接系统依据容器的名称来执行,所以一个好记的名字就很需要了。

使用 --name 可以自定义容器名

代码语言:javascript
复制
docker run -d -p --name web training/webapp python app.py

//查看是否修改
docker ps -l

注意:如果加 --rm 标记, 容器终止后会立即删除, --rm 和 -d 不能同时使用

容器互联

使用 --link 参数可以让容器之间安全的进行交互

代码语言:javascript
复制
//name 连接的容器的名称,alias 是这个连接的别名
--link name:alias


//创建一个数据库容器
docker run -d --name db training/postgres
//删除之前的web容器
docker rm -f web
//创建一个新的web容器,并将它连接到db容器
docker run -d -P --name web --link db:db training/webapp python app.py
//查看连接
docker ps
// db容器的names 列有 db, web/db 表明web容器连接到db容器,这允许web容器访问db容器的内容

创建安全隧道,不需要暴露端口到外部网络上,比较安全。

Docker 通过两种方式为容器公开连接信息。

环境变量

使用env 命令来查看web容器的环境变量

代码语言:javascript
复制
docker run --rm --name web2 --link db:db training/webapp env
更新 /etc/hosts 文件。

除了环境变量,docker 还添加host信息到父容器的/etc/hosts的文件

代码语言:javascript
复制
docker run -t -i --rm --link db:db training/webapp /bin/bash

cat /etc/hosts


// 172.17.0.7 aed84ee32bde
// ...
// 172.17.0.5 db

这里会显示2个hosts信息,

  1. 是web容器,使用自己的id作为默认主机名,
  2. db容器的ip和主机名。 可以在web容器中安装ping命令来测试跟db容器的联通
代码语言:javascript
复制
apt-get install -yqq inetutils-ping

ping db

官方ubuntu镜像默认没有安装ping,需要自己安装

用户可以连接多个子容器到父容器,比如连接多个web到db容器上

Dockerfile

Dockerfile 是一个文本格式的配置文件,用户可以使用Dockerfile 快速创建自定义镜像

基本结构

Dockerfile 分为4个部分

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令:RUN指令将对镜像执行跟随的命令,每运行一条RUN指令,镜像添加新的一层。并提交。
  4. 容器启动时执行命令:运行容器时的操作命令
代码语言:javascript
复制
# this dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author : docker_user
# Command format Instruction [arguments / command]...

# 第一行必须指定基于的基础镜像
FROM ubuntu

# 维护者信息
MAINTAINER docker_user docker_user@email.com

# 镜像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring mai universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 容器启动时执行指令
CMD /usr/sbin/nginx

指令

指令的一般格式为 INSTRUCTION arguments 指令包括 FROM、MAINTAINER、RUN 等。

FROM
代码语言:javascript
复制
FROM <image> 或 FROM <image>:<tag>

第一个指令必须是FROM指令。同一个Dockerfile 中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)

MAINTAINER
代码语言:javascript
复制
MAINTAINER <name>

指定维护者信息

RUN
代码语言:javascript
复制
//在shell 终端运行,既/bin/sh -c ;
RUN <command>

//使用exec执行。指定使用其他终端可以通过第二种方式实现
RUN ["executable", "param1", "param2"]

//例如:
RUN ["/bin/bash", "-c", "echo hello"]

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,命令较长时可以使用 \ 来换行

CMD

支持3种格式:

代码语言:javascript
复制
//1. 使用exec执行,推荐
CMD ["executable", "param1", "param2"]

//2. 在/bin/sh种执行,提供给需要交互的应用
CMD command param1 param2

//3. 提供给ENTRYPOINT的默认参数
CMD ["param1", "param2"]
EXPOSE

告诉Docker 服务端容器暴露的端口号,供互相练习使用

代码语言:javascript
复制
EXPOSE <port> [<port>...]

//例如
EXPOSE 22 80 8443

启动容器时需要通过"-P",Docker 主机会自动分配一个端口转发到指定端口 使用"-p",则可以指定哪个本地端口映射过来

ENV

指定环境变量,会被后续RUN指令使用,并在容器运行时保持

代码语言:javascript
复制
ENV <key> <value>

//例如:
ENV PG_MAJOR 9.3

可以在docker run 使用**-e**参数进行覆盖默认配置:

代码语言:javascript
复制
docker run --net=host -d -p 9999:9999 -e Server_Bind=0.0.0.0:9999  processcache

--net=host :docker运行此模式使用主机的网络(一般主机设置桥接模式)

ADD

复制指定<src>到容器中的<dest>. 其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个url,还可以是一个tar文件(自动解压为目录)

代码语言:javascript
复制
ADD <src> <dest>
COPY

复制本地主机的<src>(为Dockerfile所在目录的相对目录、文件或目录)为容器中的<dest>。目标路径不存在时,会自动创建。

代码语言:javascript
复制
COPY <src> <dest>

使用本地目录为源目录时,推荐使用COPY.

ENTRYPOINT

配置容器启动后执行命令, 并且不可被docker run 提供的参数覆盖。

每个Dockerfile中只有一个ENTRYPOINT, 当指定多个ENTRYPOINT时,只有最后一个生效

有两种格式

代码语言:javascript
复制
ENTRYPOINT ["executable", "param1", "param2"]

//shell 中执行
ENTRYPOINT command param1 param2
VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

代码语言:javascript
复制
VOLUME ["/data"]
USER

指定运行容器时的用户名或UID, 后续RUN也会使用指定用户

代码语言:javascript
复制
USER daemon

当服务不需要管理员权限时, 可以通过该命令指定运行用户。 并且可以在之前创建所需要的用户。

代码语言:javascript
复制
RUN groupadd -r postgres && useradd -r -g postgres postgres

零时获取管理员权限使用gosu,而不推荐用sudo

WORKDIR

为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录

代码语言:javascript
复制
WORKDIR /path/to/workidr

可以使用多个WORKDIR命令,后续命令如果参数是相对路径,则会基于之前命令指定路径。

代码语言:javascript
复制
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

// 最终为/a/b/c
ONBUILD

配置当所创建的镜像作为其他新创建镜像的基础镜像时的操作指令

代码语言:javascript
复制
ONBUILD [INSTRUCTION]

例如:Dockerfile 使用如下内容创建镜像image-A

代码语言:javascript
复制
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /use/local/bin/python-build --dir /app/src
[...]

新镜像Dockerfile中FROM image-A 指定基础镜像,会自动执行ONBUILD指令的内容,等价于在后面添加两句指令

代码语言:javascript
复制
FROM image-A

//等价于
ADD . /app/src
RUN /use/local/bin/python-build --dir /app/src

使用ONBUILD指令镜像,推荐在标签中注明,例如 ruby:1.9-onbuild. (也就是 image-A起名的时候起成这种标注的名字)

创建镜像

编写完Dockerfile后,可以通过docker build命令来创建镜像

代码语言:javascript
复制
docker build [选项] 路径

该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端来创建镜像。

一般建议放置Dockerfile的目录为空目录

通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。

要指定镜像的标签信息,可以通过" -t " 选项

代码语言:javascript
复制
//指定Dockerfile 所在目录 /tmp/docker_builder/,并且希望生成镜像标签为build_repo/first_image
docker build -t build_repo/first_image /tmp/docker_builder/

后续继续补充中。。。。。

参考

Docker技术入门与实战+杨保华,戴王剑,曹亚仑编著+机械工业出版社。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • VMware 安装 CentOS 7
    • 配置静态网络
    • Docker
      • 安装
        • 镜像
          • 获取镜像
          • 查看镜像信息
          • 本地镜像添加新的标签
          • 获取镜像的详细信息
          • 搜索镜像
          • 删除镜像
          • 创建镜像
          • 存出镜像
          • 载入镜像
          • 上传镜像
        • 容器
          • 查看容器
          • 创建容器
          • 启动容器
          • 终止容器
          • 进入容器
          • 删除容器
          • 导出容器
          • 导入容器
        • 仓库
          • 登录
          • 查询
          • 下载
          • 自动创建
          • 创建私有库
      • 数据管理
        • 数据卷
          • 在容器内创建一个数据卷
          • 挂载一个主机目录作为数据卷
          • 挂载一个本地主机文件作为数据卷
        • 数据卷容器
          • 使用数据卷容器迁移数据
            • 备份
            • 恢复
        • 网络基础配置
          • 端口映射实现访问容器
            • 从外部访问容器应用
            • 映射所有接口地址
            • 映射到指定地址的指定端口
            • 映射到指定地址的任意端口
            • 标记udp端口
            • 查看映射端口配置
          • 容器间通信
            • 自定义容器命名
            • 容器互联
          • Docker 通过两种方式为容器公开连接信息。
            • 环境变量
            • 更新 /etc/hosts 文件。
        • Dockerfile
          • 基本结构
            • 指令
              • FROM
              • MAINTAINER
              • RUN
              • CMD
              • EXPOSE
              • ENV
              • ADD
              • COPY
              • ENTRYPOINT
              • VOLUME
              • USER
              • WORKDIR
              • ONBUILD
            • 创建镜像
            • 参考
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档