前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker命令使用经验总结

Docker命令使用经验总结

作者头像
drunkdream
发布2020-01-02 15:54:34
5230
发布2020-01-02 15:54:34
举报
文章被收录于专栏:醉梦轩醉梦轩

0x00 前言

Docker作为现在常用的服务部署方式,日常工作中免不了要做些buildpush之类的操作。为了避免每次都要查文档,这里将一些常用的命令和技巧做一些总结。

以下以Ubuntu 16.04 x64系统作为演示环境。

0x01 环境准备

安装docker

代码语言:javascript
复制
$ apt install docker
$ docker --version
Docker version 18.06.1-ce, build e68fc7a

重启docker服务

代码语言:javascript
复制
$ systemctl daemon-reload
$ systemctl restart docker

设置docker代理

此代理主要用于docker访问镜像仓库

创建配置文件:/etc/systemd/system/docker.service.d/http-proxy.conf,写入以下内容:

代码语言:javascript
复制
[Service]
Environment="HTTP_PROXY=http://web-proxy.com:8080" "HTTPS_PROXY=http://web-proxy.com:8080" "NO_PROXY=internal.com"

重启docker服务,配置生效

0x02 编写Dockerfile

要编译docker镜像,需要先编写Dockerfile文件。以下是一个Dockerfile的例子:

代码语言:javascript
复制
FROM python:2.7
# 基于python2.7镜像

RUN apt install python-pip -y \
    && pip install uwsgi \
    && pip install tornado \
    && mkdir /data
# 编译时执行的命令,需要尽量写成一条命令

WORKDIR /data
# 设置工作目录

COPY adb /usr/bin/
# 拷贝文件
COPY api/ /data/api/
# 拷贝目录

ENV TZ="Asia/Shanghai"
# 设置时区

EXPOSE 80/tcp 8080/tcp
# 暴露服务端口

ENTRYPOINT sh /data/start.sh
# 指定入口命令,如果这个命令退出,docker容器也会一起退出

可以看出,格式还是相对比较简单的,照着例子,基本都能写出来。

0x03 编译镜像

代码语言:javascript
复制
$ docker build -t demo .

表示使用当前目录的Dockerfile构建镜像demo

指定代理

如果要指定编译时的HTTP代理,可以使用--build-arg参数:

代码语言:javascript
复制
$ docker build -t demo . --build-arg http_proxy=http://web-proxy.com:8080

指定dns服务器

如果要指定编译时的dns服务器,可以修改docker的配置文件:/etc/docker/daemon.json,增加以下配置,并重启docker服务。

代码语言:javascript
复制
"dns": ["10.0.0.1"]

指定Dockerfile路径

如果Dockerfile文件不在当前目录下,可以在docker build命令中使用-f /path/to/Dockerfile参数来制定Dockerfile文件的路径。

0x04 运行容器

代码语言:javascript
复制
$ docker run -i demo

指定运行时的dns服务器

代码语言:javascript
复制
$ docker run -i --dns=10.0.0.1 demo

指定运行时的环境变量

代码语言:javascript
复制
$ docker run -i --env http_proxy=http://web-proxy.com:8080 demo

挂载主机目录

代码语言:javascript
复制
$ docker run -i -v /home/ubuntu/data:/data demo

这样可以把主机上的/home/ubuntu/data目录挂载到容器里的/data下。

映射端口

默认情况下无法从外部访问容器内的服务,但是可以通过在启动容器时加上-p port1:port2参数,将容器内的端口port2映射到本机的port1端口。

进入容器shell

代码语言:javascript
复制
$ docker ps
CONTAINER ID  IMAGE  COMMAND                       CREATED          STATUS           PORTS              NAMES
e6ae7638a58d  demo   "/bin/sh -c '/data/start.sh'" 8 seconds ago    Up 7 seconds    80/tcp, 8080/tcp   loving_neumann

$ docker exec -i -t e6ae7638a58d sh
# id
uid=0(root) gid=0(root) groups=0(root)

如果默认进去的不是root权限,可以增加-u root参数。

0x05 登录docker仓库

登录官方仓库

代码语言:javascript
复制
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: drunkdream
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

登录非官方仓库

代码语言:javascript
复制
$ docker login hub.tencentyun.com
Username: drunkdream
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

如果仓库使用的不是HTTPS的443端口,需要在主机名后面加上:port

如果提示以下错误:

代码语言:javascript
复制
Error response from daemon: Get https://hub.private.com:8080/v2/: http: server gave HTTP response to HTTPS client

说明Server不支持HTTPS协议,需要在配置文件:/etc/docker/daemon.json中增加以下配置:

代码语言:javascript
复制
"insecure-registries": ["hub.private.com:8080"]

重启docker服务,再登录就可以了

登录协议

抓包可得以下结果:

代码语言:javascript
复制
GET /v2/ HTTP/1.1
Host: hub.private.com:8080
User-Agent: docker/18.06.1-ce go/go1.10.4 git-commit/e68fc7a kernel/4.10.0-28-generic os/linux arch/amd64 UpstreamClient(Docker-Client/18.06.1-ce \(linux\))
Authorization: Basic YWRtaW46YWRtaW4=
Accept-Encoding: gzip
Connection: close

HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json; charset=utf-8
Date: Mon, 25 Feb 2019 04:09:50 GMT
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Connection: close

{}

说明: docker是使用了HTTP协议的Authorization头进行了身份认证,很容易获取明文密码。因此,为了安全,一定要使用HTTPS协议。

0x06 push新镜像到仓库

拉取镜像到本地

代码语言:javascript
复制
$ docker pull python
Using default tag: latest
latest: Pulling from library/python
741437d97401: Pull complete 
34d8874714d7: Pull complete 
0a108aa26679: Pull complete 
7f0334c36886: Pull complete 
65c95cb8b3be: Pull complete 
9107d7193263: Pull complete 
dd6f212ec984: Pull complete 
43288b101abf: Pull complete 
89dd65885f16: Pull complete 
Digest: sha256:a570ef00b7348c85b546c0e67955fa3be233c27bc2379d0f87fc8e4ff25aa006
Status: Downloaded newer image for python:latest

打标签

代码语言:javascript
复制
$ docker tag python:latest hub.tencentyun.com/drunkdream/python:latest

如果要push到非官方仓库,需要在打tag时加上仓库的地址。

push镜像到仓库

代码语言:javascript
复制
$ docker push hub.tencentyun.com/drunkdream/python:latest
The push refers to repository [hub.tencentyun.com/drunkdream/python:latest]
b2f7bd391363: Pushed 
08a5b66845ac: Pushed 
88a85bcf8170: Pushed 
65860ac81ef4: Pushed 
a22a5ac18042: Pushed 
6257fa9f9597: Pushed 
578414b395b9: Pushed 
abc3250a6c7f: Pushed 
13d5529fd232: Pushed 
latest: digest: sha256:35a3001b1defafa4611f764a9c6d07c2146aefc17be2c24ee0200fd37b19b1c7 size: 2218

0x07 镜像导出与导入

镜像导出

代码语言:javascript
复制
$ docker save -o demo.tar demo:latest

镜像导入

代码语言:javascript
复制
$ docker load -i demo.tar
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 前言
  • 0x01 环境准备
    • 安装docker
      • 重启docker服务
        • 设置docker代理
        • 0x02 编写Dockerfile
        • 0x03 编译镜像
          • 指定代理
            • 指定dns服务器
              • 指定Dockerfile路径
              • 0x04 运行容器
                • 指定运行时的dns服务器
                  • 指定运行时的环境变量
                    • 挂载主机目录
                      • 映射端口
                        • 进入容器shell
                        • 0x05 登录docker仓库
                          • 登录官方仓库
                            • 登录非官方仓库
                              • 登录协议
                              • 0x06 push新镜像到仓库
                                • 拉取镜像到本地
                                  • 打标签
                                    • push镜像到仓库
                                    • 0x07 镜像导出与导入
                                      • 镜像导出
                                        • 镜像导入
                                        相关产品与服务
                                        容器镜像服务
                                        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                                        领券
                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档