Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
将搭建好的容器发布到hub
首先在https://hub.docker.com/
中创建一个repository
创建好后,命令行下输入如下命令登录,依次输入用户名密码
1 |
docker login |
登录完后,把所需上传的容器变为镜像
1 |
docker ps #查看运行的容器 |
注:containerId为你需要上传的容器id,dockerUserName为dockerHub的登录名,xxx为仓库名,当然也不一定非得是dockerUserName/xxx,只是为了方便起见
接下来为存在于本地的镜像打标签
1 |
docker images #查看本地镜像 |
注:imageName为你需要上传的镜像name,dockerUserName为dockerHub的登录名,xxx为仓库名,必须和你在dockerhub中新建的仓库名相同,tag不指定就是latest
打包好之后,就把打包好的镜像上传
1 |
docker push dockerUserName/xxx[:tag] |
注:tag不指定就是latest
最后就去dockerhub上查看是否上传成功
运行docker容器
创建镜像
1 |
docker pull centos #没有指定tag,默认是latest |
启动容器,并映射端口
1 |
sudo docker run -t -i -p 60000(本地):8000(容器) ye1s/ye1s:IPSearch /bin/bash |
退出容器
1 |
exit 退出并停止运行容器 |
进入在运行的容器
1 |
docker attach |
如果上面没有指定/bin/bash
1 |
docker exec -it myredis-master-6379 /bin/bash |
镜像下载慢
1 |
cd /etc/docker |
开daemon.json,内容配置如下:
使用阿里镜像加速
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
1 |
{ |
重新加载文件和重启docker
1 |
systemctl daemon-reload //重新加载 |
批量删除镜像/容器
1 |
sudo docker rmi `sudo docker images -q` |
Dockerfile
Dockerfile包含创建镜像所需要的全部指令。基于在Dockerfile中的指令,我们可以使用Docker build命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
所有Dockerfile都必须以FROM命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(译者注:CentOS和Ubuntu有些命令可是不一样的)。FROM命令可以多次使用,表示会创建多个镜像。具体语法如下:
1 |
FROM <image name> |
Dockerfile命令
- MAINTAINER:设置该镜像的作者。语法如下:
1
MAINTAINER <author name>
- RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:
1
RUN 《command》
- ADD:复制文件指令。它有两个参数和。destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件。语法如下:
1
ADD 《src》 《destination》
- CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:
1
2
3CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2 - EXPOSE:指定容器在运行时监听的端口。语法如下:
1
EXPOSE <port>;
- ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:
1
2ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2 - WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:
1
WORKDIR /path/to/workdir
- ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:
1
ENV <key> <value>
- USER:镜像正在运行时设置一个UID。语法如下:
1
USER <uid>
- VOLUME:授权访问从容器内到主机上的目录。语法如下:
1
VOLUME ["/data"]
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# base image
FROM centos
# MAINTAINER
MAINTAINER [email protected]
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
EXPOSE 80
Docker-compose
在测试目录中,执行以下命令来启动应用程序:
1 |
docker-compose up |
如果你想在后台执行该服务可以加上 -d 参数:
1 |
docker-compose up -d |
docker-compose.yml的指令
version
指定本 yml 依从的 compose 哪个版本制定的。
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
1 |
version: "3.7" |
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
1 |
version: "3.7" |
context:上下文路径。
dockerfile:指定构建镜像的 Dockerfile 文件名。
args:添加构建参数,这是只能在构建过程中访问的环境变量。
labels:设置构建镜像的标签。
target:多层构建,可以指定构建哪一层。
cap_add,cap_drop
添加或删除容器拥有的宿主机的内核功能。
1 |
cap_add: |
cgroup_parent
为容器指定父 cgroup 组,意味着将继承该组的资源限制。
1 |
cgroup_parent: m-executor-abcd |
command
覆盖容器启动的默认命令。
1 |
command: ["bundle", "exec", "thin", "-p", "3000"] |
container_name
指定自定义容器名称,而不是生成的默认名称。
1 |
container_name: my-web-container |
depends_on
设置依赖关系。
docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
1 |
version: "3.7" |
注意:web 服务不会等待 redis db 完全启动 之后才启动。
devices
指定设备映射列表。
1 |
devices: |
dns
自定义 DNS 服务器,可以是单个值或列表的多个值。
1 |
dns: 8.8.8.8 |
dns_search
自定义 DNS 搜索域。可以是单个值或列表。
1 |
dns_search: example.com |
entrypoint
覆盖容器默认的 entrypoint。
1 |
entrypoint: /code/entrypoint.sh |
也可以是以下格式:
1 |
entrypoint: |
env_file
从文件添加环境变量。可以是单个值或列表的多个值。
1 |
env_file: .env |
也可以是列表格式:
1 |
env_file: |
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
1 |
environment: |
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
1 |
expose: |
extra_hosts
添加主机名映射。类似 docker client –add-host。
1 |
extra_hosts: |
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
1 |
162.242.195.82 somehost |
healthcheck
用于检测 docker 服务是否健康运行。
1 |
healthcheck: |
image
指定容器运行的镜像。以下格式都可以:
1 |
image: redis |
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
1 |
driver: "json-file" |
仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。
1 |
logging: |
当达到文件限制上限,会自动删除旧得文件。
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
1 |
logging: |
network_mode
设置网络模式。
1 |
network_mode: "bridge" |
networks
配置容器连接的网络,引用顶级 networks 下的条目 。
1 |
services: |
aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
restart
no:是默认的重启策略,在任何情况下都不会重启容器。
always:容器总是重新启动。
on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: “no”
restart: always
restart: on-failure
restart: unless-stopped
注:swarm 集群模式,请改用 restart_policy。
secrets
存储敏感数据,例如密码:
1 |
version: "3.1" |
security_opt
修改容器默认的 schema 标签。
1 |
security-opt: |
stop_grace_period
指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。
1 |
stop_grace_period: 1s # 等待 1 秒 |
默认的等待时间是 10 秒。
stop_signal
设置停止容器的替代信号。默认情况下使用 SIGTERM 。
以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
1 |
stop_signal: SIGUSR1 |
sysctls
设置容器中的内核参数,可以使用数组或字典格式。
1 |
sysctls: |
tmpfs
在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
1 |
tmpfs: /run |
ulimits
覆盖容器默认的 ulimit。
1 |
ulimits: |
volumes
将主机的数据卷或着文件挂载到容器里。
1 |
version: "3.7" |
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论