Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第一章 Docker入门基础

第一章 Docker入门基础

作者头像
公众号: 云原生生态圈
发布于 2021-11-15 09:49:05
发布于 2021-11-15 09:49:05
69700
代码可运行
举报
文章被收录于专栏:云原生生态圈云原生生态圈
运行总次数:0
代码可运行

Docker入门基础

课题简述

简单入门docker的基本使用,文本介绍docker命令的基础使用,docker镜像库,网络,存储的一些知识

环境

  • ubuntu16.04
  • python3.6
  • Docker version 1.13.1
  • Docker ID(为了镜像在公共仓库的pull,push)

一、Install Docker

1.1 安装docker-ce

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates
sudo apt-key adv \
              --keyserver hkp://ha.pool.sks-keyservers.net:80 \
              --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
#append this to /etc/apt/sources.list
cat >> /etc/apt/sources.list <<EOF
deb https://apt.dockerproject.org/repo ubuntu-xenial main
EOFsudo apt-get update
apt-cache policy docker-engine
apt-get upgrade -y
sudo apt-get install -y linux-image-extra-$(uname -r) linux-image-extra-virtual
sudo apt-get install -y docker-engine

1.2 默认安装系统自带的docker

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apt-get update
# 默认将会安装最新版的docker1.13.1
apt-get install docker.io
1.2.1 docker1.13带来的新功能
  • 正式支持服务栈: docker stack
  • 正式支持插件:docker plugin
  • 添加在 Swarm 集群环境下对密码、密钥管理的 secret 管理服务:docker secret
  • 增加 docker system 命令
  • 可以直接使用 docker-compose.yml 进行服务部署
  • 添加 docker service 滚动升级出故障后回滚的功能
  • 增加强制再发布选项 docker service update –force
  • 允许 docker service create 映射宿主端口,而不是边界负载均衡网络端口
  • 允许 docker run 连入指定的 swarm mode 的 overlay 网络
  • 解决中国 GFW 墙掉 docker-engine apt/yum 源的问题

1.3 配置加速器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/docker/daemon.json
{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}
# --registry-mirror=http://alaudademo13.m.alauda.cn
# "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]

1.4 了解docker安装目录

编号

路径名

意义

1

/var/lib/docker/devicemapper/devicemapper/data

用来存储相关的存储池数据

2

/var/lib/docker/devicemapper/devicemapper/metadata

用来存储相关的元数据

3

/var/lib/docker/devicemapper/metadata/

用来存储 device_id、大小、以及传输_id、初始化信息

4

/var/lib/docker/devicemapper/mnt

用来存储挂载信息

5

/var/lib/docker/container/

用来存储容器信息

6

/var/lib/docker/graph/

用来存储镜像中间件及镜像的元数据信息、以及依赖信息

7

/var/lib/docker/repositores-devicemapper

用来存储镜像基本信息

8

/var/lib/docker/tmp

docker临时目录

9

/var/lib/docker/trust

docker信任目录

10

/var/lib/docker/volumes

docker卷目录

二、Docker基础命令

2.1 命令的分类

子命令分类

子命令

与镜像相关的命令

images,search,pull,push,login,logout,commit,build,rmi(127)

容器生命周期管理

create,exec,kill,pause,restart,rm,run,start,stop,unpause

环境信息相关

info,version

系统维护相关

images,inspect,build,commit,pause/unpause,ps,rm,rmi,run,start/stop/restart,top,kill,…

日志信息相关

events,history,logs

Docker ID 相关

login,logout

与容器相关的命令

run, kill, stop, start, restart, logs, export, import

2.2 命令的基础使用

2.2.1 使用man,help学习docker命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
man docker subcommand
docker help subcommand
docker command --help
2.2.2 Docker镜像的操作

显示镜像信息

查询镜像

  • docker search IMAGE_NAME

镜像的拉取删除与修改,重命名,创建

还有一些其他的命令

2.2.3 容器的生命周期管理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Commands:
 attach      # 进入一个正在运行的容器,不建议使用
 commit      # 把一个正在运行的容器打包成一个新的镜像
 cp          # 在容器与本地文件系统之间进行文件/文件夹拷贝
 create      # 创建一个新的容器
 diff        # 检查运行的容器与所使用镜像之间的变化
 exec        # 进入正在运行的容器
 export      # 把一个容器的文件系统归档成一个tar包
 inspect     # 显示一个/多个容器的详细信息
 kill        # 杀掉一个/多个正在运行的容器
 logs        # 查看容器中进程的运行日志
 ls          # 列出容器列表
 pause       # 暂停一个/多个容器中的所有进程
 port        # 显示容器与docker host的端口映射
 prune       # 移除所有所有停掉的容器
 rename      # 重命名容器
 restart     # 重启容器
 rm          # 删除一个或多个容器
 run         # 运行一个容器
 start       # 启动一个或多个容器
 stats       # 显示容器资源的使用信息
 stop        # 停止一个或多个容器
 top         # 显示容器中的进程
 unpause     # 恢复暂停的容器
 update      # 更新容器的配置(cpu,mem,重启的策略等)
 wait        # 阻塞运行直到容器停止,然后打印出它的退出代码
2.2.4 run wordpress on docker

Deploy MYSQL

挂载卷保存数据文件

MySQL使用过程中的环境变量 Num|Env Variable| Description —-|—-|—- 1|MYSQL_ROOT_PASSWORD|root用户的密码 2|MYSQL_DATABASE|创建一个数据库 3|MYSQL_USER,MYSQL_PASSWORD|创建一个用户以及用户密码 4|MYSQL_ALLOW_EMPTY_PASSWORD|允许空密码

创建网络

创建MYSQL container ```Shell ➜ ~ docker run -v /mysql/data:/var/lib/mysql —name mysqldb —restart=always -p 3306:3306 -e MYSQL_DATABASE=’wordpress’ -e MYSQL_USER=’marion’ -e MYSQL_PASSWORD=’marion’ -e MYSQL_ALLOW_EMPTY_PASSWORD=’yes’ -e MYSQL_ROOT_PASSWORD=’marion’ —network=marion —ip=10.0.0.2 -d mysql ➜ ~ docker ps -a ➜ marion docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3013c407c74b mysql “docker-entrypoint…” 4 minutes ago Up 4 minutes 0.0.0.0:3306->3306/tcp mysqldb ➜ marion docker exec -it 3013c407c74b /bin/bash root@3013c407c74b:/# ip addr 1: lo:

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> show databases; +——————————+ | Database | +——————————+ | information_schema | | wordpress | +——————————+ 2 rows in set (0.01 sec)

mysql>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 3、运行nginx-php

mkdir -p /var/www/html docker run —name php7 -p 9000:9000 -p 80:80 -v /var/www/html:/usr/local/nginx/html —restart=always —network=marion —ip=10.0.0.3 -d skiychan/nginx-php7 docker ps docker exec -it cfb9556b71b3 /bin/bash cd /usr/local/php/etc vim php.ini date.timezone =Asia/Shanghai

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 编辑nginx配置文件/usr/local/nginx/conf/nginx.conf
```Shell
user www www;  #modify
worker_processes auto;  #modify#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
error_log /var/log/nginx_error.log crit;  #add#pid        logs/nginx.pid;
pid /var/run/nginx.pid;  #modify
worker_rlimit_nofile 51200;events {
   use epoll;
   worker_connections 51200;
   multi_accept on;
}http {
   include       mime.types;
   default_type  application/octet-stream;   #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
   #                  '$status $body_bytes_sent "$http_referer" '
   #                  '"$http_user_agent" "$http_x_forwarded_for"';   #access_log  logs/access.log  main;   client_max_body_size 100m;  #add
   sendfile        on;
   #tcp_nopush     on;   #keepalive_timeout  0;
   keepalive_timeout  120; #65;   #gzip  on;   server {
       listen       80;
       server_name  localhost;       #charset koi8-r;       #access_log  logs/host.access.log  main;       root   /usr/local/nginx/html;
       index  index.php index.html index.htm;       location / {
           try_files $uri $uri/ /index.php?$args;
       }       #error_page  404              /404.html;       # redirect server error pages to the static page /50x.html
       #
       error_page   500 502 503 504  /50x.html;
       location = /50x.html {
           root   html;
       }       location ~ \.php$ {
           root           /usr/local/nginx/html;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME  /$document_root$fastcgi_script_name;
           include        fastcgi_params;
       }
   }   #add
   ##########################vhost#####################################
   include vhost/*.conf;}daemon off;

测试配置文件是否有问题

重新加载配置文件

2.2.5 容器的重启策略
  • no
  • on-failure
  • always
  • unless-stopped

三、Dockerfile

Comment

INSTRUCTION arguments

1. FROM

基于哪个base镜像

2. RUN
  • 执行命令并创建新的镜像层,run经常用于安装软件包
3. MAINTAINER

镜像创建者

4. copy

将文件从build context复制到镜像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#1
COPY ["src","dest"]
COPY src dest
#注意:src只能指定build context中的文件
5. CMD
  • container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD。CMD主要用于container启动时指定的服务
  • 当docker run command的命令匹配到CMD command时,会替换CMD执行的命令。
  • 存在三种使用格式
    • Exec: CMD [“Command”,”param1”,”param2”]
    • CMD [“param1”,”param2”] 为ENTRYPOINT提供额外的参数,此时ENTRYPOINT必须使用exec格式
    • CMD command param1 param2
6. ENTRYPOINT

container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条。ENTRYPOINT没有CMD的可替换特性

  • ENTRYPOINT的exec格式用于设置执行的命令及其参数,同时可通过CMD提供额外的参数
  • ENTRYPOINT的shell格式会忽略任何CMD或docker run提供的参数
7. USER

使用哪个用户跑container

8. EXPOSE

container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射: docker run -d -p 127.0.0.1:3000:22 ubuntu-ssh container ssh服务的22端口被映射到主机的33301端口

9. ENV

用来设置环境变量,比如:ENV ROOT_PASS tenxcloud

10. ADD

将文件拷贝到container的文件系统对应的路径。ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。如果src是一个tar,zip,tgz,xz文件,文件会被自动的解压到dest

11. VOLUME

可以将本地文件夹或者其他container的文件夹挂载到container中。

12. WORKDIR

切换目录用,可以多次切换(相当于cd命令),对RUN、CMD、ENTRYPOINT生效

13. ONBUILD

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

14. 两种方式shell,EXEC指定run,cmd和entrypoint要运行的命令
  • CMD和ENTRYPOINT建议使用Exec格式
  • RUN则两种都是可以的

注意

构建dockerfile时,必须提前转备好build context中的文件

四、Docker registry

4.1 搭建本地镜像仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#检查端口5000是否被占用
netstat -tunlp | grep 5000
# pull registry
mkdir -p /opt/myregistry
docker run -d -p 5000:5000 --name registry --restart=always -v /opt/myregistry:/var/lib/registry registry:2.4.1
curl http://172.17.0.1:5000/v2
# modify https to http
echo "{"insecure-registries:["172.17.0.1:5000"]"}" > /etc/docker/daemon.json
# 拉取busybox镜像做测试
docker pull busybox
# tag镜像
docker tag busybox 172.17.0.1:5000/busybox01
# 删除tag为latest的镜像
docker rmi busybox
# push镜像到本地仓库
docker push 172.17.0.1:5000/busybox01
# check
tree -l 4 /opt/myregistry
# 删除下载的busybox镜像
docker rmi 172.17.0.1:5000/busybox01
# 从本地镜像仓库下载
docker pull 172.17.0.1:5000/busybox01

4.2 公有仓库Docker Hub

  • sign up a docker id
  • sign in docker hub
  • Docker Cloud

4.3 企业级harbor仓库

4.3.1 download harbor offline tar package
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://github.com/vmware/harbor/releases/download/v1.2.2/harbor-offline-installer-v1.2.2.tgz -o /home/marion/docker
tar xf /home/marion/docker/harbor-offline-installer-v1.2.2.tgz
cd /home/marion/docker/harbor
4.3.2 添加域名解析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/hosts
## append this
10.0.0.128 www.proharbor.com
## 检查是否正常
ping www.proharbor.com
4.3.3 创建自签证书
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir /home/marion/docker/harbor/newcert
cd /home/marion/docker/harbor/newcert
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
openssl req -newkey rsa:4096 -nodes -sha256 -keyout proharbor.com.key -out proharbor.com.csr
openssl x509 -req -days 3650 -in proharbor.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out proharbor.com.crt
mkdir -pv /etc/docker/certs.d/www.proharbor.com
cp /home/marion/docker/harbor/newcert/ca.crt /etc/docker/certs.d/www.proharbor.com/
cp /home/marion/docker/harbor/newcert/proharbor.com.crt /usr/local/share/ca-certificates/www.proharbor.com.crt
update-ca-certificates
4.3.4 更新配置文件
4.3.4.1 更新harbor.cfg
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hostname = www.proharbor.com
ui_url_protocol = https
ssl_cert = /home/marion/docker/harbor/newcert/proharbor.com.crt
ssl_cert_key = /home/marion/docker/harbor/newcert/proharbor.com.key
4.3.4.2 更新docker-compose.yml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建本地仓库镜像的存储目录
cd /home/marion/docker/harbor
mkdir /home/marion/harborregistry/
vim docker-compose.yml
# ------以下是docker-compose.yml修改后的内容------
version: '2'
services:
 log:
   image: vmware/harbor-log:v1.2.2
   container_name: harbor-log
   restart: always
   volumes:
     - /var/log/harbor/:/var/log/docker/:z
   ports:
     - 127.0.0.1:1514:514
   networks:
     - harbor
 registry:
   image: registry:2.4.1
   container_name: registry
   restart: always
   volumes:
     - /home/marion/harborregistry:/storage:z
     - ./common/config/registry/:/etc/registry/:z
   networks:
     - harbor
   environment:
     - GODEBUG=netdns=cgo
   command:
     ["serve", "/etc/registry/config.yml"]
   depends_on:
     - log
   logging:
     driver: "syslog"
     options:  
       syslog-address: "tcp://127.0.0.1:1514"
       tag: "registry"
 mysql:
   image: vmware/harbor-db:v1.2.2
   container_name: harbor-db
   restart: always
   volumes:
     - /data/database:/var/lib/mysql:z
   networks:
     - harbor
   env_file:
     - ./common/config/db/env
   depends_on:
     - log
   logging:
     driver: "syslog"
     options:  
       syslog-address: "tcp://127.0.0.1:1514"
       tag: "mysql"
 adminserver:
   image: vmware/harbor-adminserver:v1.2.2
   container_name: harbor-adminserver
   env_file:
     - ./common/config/adminserver/env
   restart: always
   volumes:
     - /data/config/:/etc/adminserver/config/:z
     - /data/secretkey:/etc/adminserver/key:z
     - /data/:/data/:z
   networks:
     - harbor
   depends_on:
     - log
   logging:
     driver: "syslog"
     options:  
       syslog-address: "tcp://127.0.0.1:1514"
       tag: "adminserver"
 ui:
   image: vmware/harbor-ui:v1.2.2
   container_name: harbor-ui
   env_file:
     - ./common/config/ui/env
   restart: always
   volumes:
     - ./common/config/ui/app.conf:/etc/ui/app.conf:z
     - ./common/config/ui/private_key.pem:/etc/ui/private_key.pem:z
     - /data/secretkey:/etc/ui/key:z
     - /data/ca_download/:/etc/ui/ca/:z
     - /data/psc/:/etc/ui/token/:z
   networks:
     - harbor
   depends_on:
     - log
     - adminserver
     - registry
   logging:
     driver: "syslog"
     options:  
       syslog-address: "tcp://127.0.0.1:1514"
       tag: "ui"
 jobservice:
   image: vmware/harbor-jobservice:v1.2.2
   container_name: harbor-jobservice
   env_file:
     - ./common/config/jobservice/env
   restart: always
   volumes:
     - /data/job_logs:/var/log/jobs:z
     - ./common/config/jobservice/app.conf:/etc/jobservice/app.conf:z
     - /data/secretkey:/etc/jobservice/key:z
   networks:
     - harbor
   depends_on:
     - ui
     - adminserver
   logging:
     driver: "syslog"
     options:  
       syslog-address: "tcp://127.0.0.1:1514"
       tag: "jobservice"
 proxy:
   image: vmware/nginx-photon:1.11.13
   container_name: nginx
   restart: always
   volumes:
     - ./common/config/nginx:/etc/nginx:z
   networks:
     - harbor
   ports:
     - 80:80
     - 443:443
     - 4443:4443
   depends_on:
     - mysql
     - registry
     - ui
     - log
   logging:
     driver: "syslog"
     options:  
       syslog-address: "tcp://127.0.0.1:1514"
       tag: "proxy"
networks:
 harbor:
   external: false
4.3.4.3 仓库根目录配置文件

这个文件可以看到容器中镜像存储的根目录,根据此可以把其共享到docker host

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: 0.1
log:
 level: debug
 fields:
   service: registry
storage:
   cache:
       layerinfo: inmemory
   filesystem:
       rootdirectory: /storage
   maintenance:
       uploadpurging:
           enabled: false
   delete:
       enabled: true
http:
   addr: :5000
   secret: placeholder
   debug:
       addr: localhost:5001
auth:
 token:
   issuer: harbor-token-issuer
   realm: https://www.proharbor.com/service/token
   rootcertbundle: /etc/registry/root.crt
   service: harbor-registrynotifications:
 endpoints:
     - name: harbor
       disabled: false
       url: http://ui/service/notifications
       timeout: 3000ms
       threshold: 5
       backoff: 1s
4.3.5 安装harbor以及notary,clair
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /home/marion/docker/harbor/
sudo ./install.sh --with-notary --with-clair
#关闭harbor所有的容器(必须在含有docker-compose.yml文件的目录下执行)
docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml down -v
#启动harbor相关的所有容器(必须在含有docker-compose.yml文件的目录下执行)
docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml up -d
4.3.6 验证查看
  • 打开浏览器,输入https://www.proharbor.com
  • 用户名/密码:admin/Harbor12345(默认的)
  • 打开终端: docker login www.proharbor.com ,admin/Harbor12345
4.3.7 查看日志
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#日志路径各不相同,具体路径根据docker-compose.yml或者*/harbor/common/目录下的配置文件进行确定
cd /var/log/harbor
docker logs 容器功能名称
4.3.8 push/pull
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#push
root@dockermaster:/home/marion/docker/harbor# docker tag redis www.proharbor.com/harborssl/redis:dev
root@dockermaster:/home/marion/docker/harbor# docker push www.proharbor.com/harborssl/redis:dev
The push refers to a repository [www.proharbor.com/harborssl/redis]
d112bb627859: Pushed
265ab1ac61ec: Pushed
2341e66d779d: Pushed
9503917b6420: Pushed
aa84bbcc6553: Pushed
29d71372a492: Pushed
dev: digest: sha256:b707a0c39062f1769c8e16069015e1ba839add849deb441428fc0c1deee67c36 size: 1571
#pull
root@dockermaster:/home/marion/docker/harbor# docker pull www.proharbor.com/harborssl/redis:dev
dev: Pulling from harborssl/redis
Digest: sha256:b707a0c39062f1769c8e16069015e1ba839add849deb441428fc0c1deee67c36
Status: Downloaded newer image for www.proharbor.com/harborssl/redis:dev
4.3.9 harbor参考链接
  • harbor project
  • vmware harbor
  • harbor安装指南
  • harbor用户指南
  • https访问harbor
  • docker-compse命令行参考

五、Docker网络

docker在安装的时候就会配置一个docker0的linux bridge的方式,在不使用 --network时, 这也是docker默认使用的方式。docker有三种常见的网络模式,分别是none,bridge,host

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3ea8a3ad1a61        bridge              bridge              local
9043e76f315a        host                host                local
eba2113c67eb        none                null                local

5.1、docker network command

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ docker network --helpUsage:    docker network COMMANDManage networksOptions:
     --help   Print usageCommands:
 connect     把一个容器连接到网络
 create       创建一个网络
 disconnect  从网络中中断容器的连接
 inspect     在一个或多个网络上显示详细信息
 ls          列出网络
 prune      移除所有未使用的网络
 rm          移除一个或多个网络

5.2、docker none network

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ docker run -it --network=none busybox
/ # ifconfig
lo        Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
         UP LOOPBACK RUNNING  MTU:65536  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)/ #

5.3、docker host network

host网络模式,其实就是借用的docker host上的网卡信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ docker run -it --network=host busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:D7:FD:FF:0D  
         inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
         inet6 addr: fe80::42:d7ff:fefd:ff0d/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:119 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:0 (0.0 B)  TX bytes:13785 (13.4 KiB)
...

docker network网络的优缺点:

  • 好处
    • docker host网络的性能比较好
    • docker host网络传输效率高
  • 缺点
    • docker host的主机上使用的端口,容器不能继续使用

5.4、docker bridge network

brctl show 将会显示docker0上的网络设备,如果有容器运行的是bridge的网络模式,就会把虚拟网卡挂在docker0上,这里应该注意的是:容器内的虚拟网卡与docker0上挂的虚拟网卡是成对存在的pair

5.4.1 安装brctl工具
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apt-get install bridge-utils -y
5.4.2查看容器的网络地址
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~ docker run -it --network=bridge busybox
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03  
         inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:12 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:1459 (1.4 KiB)  TX bytes:0 (0.0 B)lo        Link encap:Local Loopback  
         inet addr:127.0.0.1  Mask:255.0.0.0
         UP LOOPBACK RUNNING  MTU:65536  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

5.5 docker网络模式之用户自定义网络

docker提供三种自定义的网络驱动

  • bridge
  • overlay :此次不share
  • macvlan :此次不share
5.5.1 创建自定义bridge网络
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker network create --driver bridge bridge1
brctl show
docker network create --driver bridge --subnet 172.17.16.0/24 --dateway 172.17.16.1 bridge2
docker run -it --network=bridge2 busybox
----ifconfig
docker run -it --network=bridge2 --ip=172.17.16.3 busybox

5.6、docker容器之间的互联互通

docker容器之间的互联互通基于三种模式:IP,Docker DNS,joined

5.6.1 基于IP方式的互联互通
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -it --network=bridge2 --ip=172.17.16.4 busybox
docker run -it --network=bridge2 --ip=172.17.16.5 busybox
ping -c 3 172.17.16.4(from 172.17.16.5)
5.6.2 基于Docker DNS之间的互联互通

注意:docker dns只能使用在用户自定的网络模式下运行的容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -it --network=bridge2 --name=busyboxone busybox
docker run -it --network=bridge2 --name=busyboxtwo busybox
ping -c 3 busyboxone(form busyboxtwo)
5.6.3 基于join方式的互联互通

仔细观察此种模式下的网络配置信息完全一样,是通过127.0.0.1进行通信

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -it --name web1 httpd
docker run -it --network=container:web1 httpd

5.7 docker容器与外部是如何进行互相访问的

5.7.1 docker容器访问外部

docker默认的网络是bridge网络,因此只要docker host可以连接互联网,那么容器就是可以联网的,但是容器访问外部网络的过程是如何实现的呢? 容器在向外部发送请求时,docker在NAT上将容器的源地址改为了docker host的地址,因此访问外部的源地址就变成了docker host的地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ip r
iptables -t NAT -S
tcpdump -i docker0 -n icmp
tcpdump -i ens33 -n icmp
5.7.2 外部是如何访问docker容器的

容器为了响应外部的访问请求,把容器自己的内部端口暴露给docker host,于是和docker host进行了 端口之间的映射,外部进行访问容器就会变成访问docker host上的一个端口,当docker-proxy进行发现有访问docker host上的容器映射的端口时,就会自动转发给容器,这就是外部访问容器的一个过程;

六、Docker存储

docker存储驱动storage driver(优先使用linux默认的storage driver,因为比较稳定)

  • ubuntu:aufs,/var/lib/docker/aufs
  • redhat/centos:device mapper
  • suse:btrfs

6.0 容器的状态

容器的状态能判断出该容器是否需要持久性存储数据,比如busybox这类的容器,我们只是通过其容器内集成好的一些命令供我们测试某种特定的功能,类似于wget,ping等,这个是不需要持久性存储的,但是对于grafana这类容器来说,这是需要再启动时就要加载数据的,因此需要持久性存储

6.1 docker volume

Data Volume本质上是docker host文件系统中的目录或文件,能够直接被mount到容器的文件系统中。Data Volume 有以下特点:

  • Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
  • 容器可以读写 volume 中的数据。
  • volume数据可以被永久的保存,即使使用它的容器已经销毁
6.1.1 bind mount

格式1:-v:#指定docker host路径与container的路径 ==注意: 容器原有的目录container_path中如果有文件,此时会被host_path中的文件覆盖,类似与linux mount命令==

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d -p 7001:80 -v /root/htdocs:/usr/local/apache2/htdocs httpd
docker run -d -p 7001:80 -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd        #(ro)表示只读
# 类似于selinux这类标签系统,可以在volume挂载时使用z或Z指定该volume是否可以共享,默认为z即为共享,对于这种权限,容器内是无法修改的,只有在docker host上才可以修改权限

格式2:-v/index.html:/new_index.html # 注意bind mount还可以指定单一的文件,但是注意,对于单一文件来说,其实相当于对容器内部添加新文件,注意其使用格式,这样也可以保留原有容器中的数据文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d -p 7001:80 -v /root/htdocs/index.html:/usr/local/apache2/htdocs/new_index.html httpd
# new_index.html在原容器中是没有的,因此此种格式不会类似于目录挂载完全覆盖数据,只是在原有数据的基础上添加一个新文件new_index.html

此类型挂载数据是比较方便备份和迁移数据,但是对于容器的迁移是比较麻烦的

6.2 docker managed volume

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d -p 7002:80 -v /usr/local/apache2/htdocs --name web1 httpd    #只指定container path
docker inspect web1    #查找Source
docker volume ls
docker volume inspect VOLUME_NAME
# 注意-v 后面指定的是容器内的目录,也就是上文中说的container_path, 这种格式是把container_path中的文件复制到了docker host中docker volume中,其本质是把镜像层中的数据给共享出来了.

6.3 docker data mount与docker managed volume对比

类型

docker_data_mount

docker_managed_volume

volume location

anywhere

/var/lib/docker/volumes/…

如果存在挂载点

隐藏并替换为volume

原有数据复制到volume

是否支持单文件挂载

yes

no(must dir)

privileges

read-only & read-write

read_write

移植性

弱,需要指定host path

强,不需指定host目录

6.4 volume container共享数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker create --name vc_data -v /root/htdocs:/usr/local/apache2/htdocs -v /var/www/html busybox
docker run -d -p 7006:80 --name web1 --volume-from vc_data httpd

6.5 数据卷的生命周期管理

6.5.1 备份

docker registry挂载的卷是本地的文件系统,因此针对文件系统备份就可以

6.5.2 恢复

使用备份的文件拷贝到docker registry挂载的本地文件系统中就可以

6.5.3 更新

registry version迁移数据

  • docker stop CONTAINER:registry
  • 启用新的registry并mount原始的挂载文件系统
6.5.4 销毁
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker rm #删除容器
docker rm -v # 删除容器以及容器使用的volume
docker volume ls
docker volume rm
docker volume rm $(docker volume ls -q)

七、DockerUI 容器管理平台

Docker UI

shipyard

docker ui

八、Docker日志管理

logging driver

docker默认的日志驱动是json-file. 可以在/etc/docker/daemon.json文件中进行修改可配置选项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
 "log-driver": "json-file",
 "log-opts": {
   "labels": "production_status",
   "env": "os,customer"
 }
}
查看docker logging driver
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker info | grep 'Logging Driver'
查看正在运行的容器的日志存储驱动
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker inspect -f '{{.HostConfig.LogConfig.Type}}' CONTAINER_ID
设置docker的日志存储驱动类型

通过docker daemon设置日志存储类型

对单一容器设置存储类型

注意: 只会对新创建的容器生效,已经存在的容器不会使用配置的日志驱动

docker logs不会显示日志的情况

docker logs会显示一些有用的信息到stdin,stdout,stderr,但是对于以下一些情况不会输出信息到这些地方

  • 非交互式的web服务器或者数据库容器
  • 使用logging driver的容器
refer link
  • docker logging driver
  • Docker log driver plugins
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生生态圈 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Aeraki Mesh 加入 CNCF 云原生全景图
近日,Aeraki Mesh 正式进入 CNCF 云原生全景图,位于 Service Mesh 类别下。CNCF Landscape 在云原生实践过程中的每个环节帮助用户了解有哪些具体的软件和产品选择,Aeraki Mesh 进入 CNCF Landscape,意味着 Aeraki Mesh 正式成为了 CNCF 认可的构建云原生最佳实践中的一环。
赵化冰
2022/08/01
3770
Aeraki Mesh 加入 CNCF 云原生全景图
服务网格项目Aeraki Mesh正式进入CNCF沙箱
6月15日,云原生计算基金会 (CNCF) 宣布,由腾讯云牵头,灵雀云等多家伙伴合作开源的服务网格项目 Aeraki Mesh 正式成为 Sandbox 项目。此前,Aeraki Mesh 已加入 CNCF Landscape 云原生全景图,并在 2022 冬奥会线上直播、央视频、腾讯音乐、王者破晓等多个超大型项目中落地应用。被纳入 CNCF 托管,也意味着 Aeraki Mesh 成为云原生生态认可的,构建服务网格技术领域最佳实践的重要项目。
灵雀云
2022/08/11
3590
服务网格项目Aeraki Mesh正式进入CNCF沙箱
Istio 环境网格五件令人兴奋的事情
Istio 环境网格(ambient mesh)是9 月 7 日在 Istio 社区中推出[1]的一种新的无边车(sidecar-less)数据平面架构。在与我们出色的工程师一起工作了几个月后,我个人很自豪能够成为环境网格发布的一部分。大约两年前,我写了“服务网格仍然很难[2]”的博客,博客中的许多观点仍然适用于边车架构。在这篇博客中,我想强调环境网格中让我非常兴奋的五件事,同时回到我在之前的博客中提出的一些观点。
CNCF
2022/11/28
4000
锅总介绍CNCF主要目标、全景图及发展历史
云原生计算基金会(Cloud Native Computing Foundation,简称 CNCF)是一个成立于 2015 年的非营利性组织,隶属于 Linux 基金会。CNCF 的主要目标是通过开源软件推动云原生计算技术的发展和普及,帮助企业更好地构建和运行可扩展的现代应用程序。
锅总
2024/08/05
6220
锅总介绍CNCF主要目标、全景图及发展历史
告别 Sidecar—— 使用 EBPF 解锁内核级服务网格
译者注:本文作者是 Isovalent 联合创始人 & CTO,原文标题 How eBPF will solve Service Mesh - Goodbye Sidecars[1],译者宋净超。作者回顾了 Linux 内核的连接性,实现服务网格的几种模式,以及如何使用 eBPF 实现无 Sidecar 的服务网格。
CNCF
2021/12/13
1.4K0
告别 Sidecar—— 使用 EBPF 解锁内核级服务网格
Aeraki Mesh 正式成为 CNCF 沙箱项目
6月15日,我创建的 Aeraki Mesh 项目通过了全球顶级开源基金会云原生计算基金会(CNCF)技术监督委员会评定,正式成为CNCF 沙箱项目!这意味着 Aeraki Mesh 得到了云原生开源社区的认可,而且加入 CNCF 也保证了项目的中立和开源开放,为 Aeraki Mesh 在云原生生态系统的进一步发展迈出了坚定的一步。
赵化冰
2022/08/01
5680
Aeraki Mesh 正式成为 CNCF 沙箱项目
Envoy 架构及其在网易轻舟的落地实践
首先解释什么是 Envoy。Envoy 社区的定义是:Envoy 是一个开源的边缘与服务代理,专为云原生应用而设计。此处只需要抓住最核心的词--代理。
CNCF
2020/11/09
1.9K0
Envoy 架构及其在网易轻舟的落地实践
从 Istio 在 CNCF 毕业,看服务网格的架构变迁
近日(美国东部时间 7 月 12 日),CNCF 通过官网宣布,Istio 正式成为毕业项目,理由是作为一个快速增长的服务网格产品,为该领域增添了更多的终端用户、产品特性和维护者,达到了基金会的最高成熟度。
深度学习与Python
2023/08/09
3990
从 Istio 在 CNCF 毕业,看服务网格的架构变迁
Istio 正式成为 CNCF 孵化项目
作者 | 褚杏娟   在今年 4 月,谷歌提议将 Istio 捐赠给 CNCF,该想法得到了社区众多开发者的关注和支持。经过近半年的尽职调查,9 月 28 日,CNCF 正式宣布技术监督委员会 (TOC) 已投票用过将 Istio 作为 CNCF 孵化项目。 Istio 服务网格在逻辑上分为数据平面和控制平面。数据平面由一组智能 Envoy 代理组成,最常部署为 Sidecar。这些代理调解和控制微服务之间的所有网络通信。控制平面则管理和配置代理以路由流量。 近期,Istio 宣布引入全新的无 sidec
深度学习与Python
2023/03/29
3050
Istio 正式成为 CNCF 孵化项目
百度在 Service Mesh 上的大规模落地实践
作者 | 刘超 策划 | 凌敏 4 月 15 日 -16 日,由 InfoQ 主办的 DIVE 全球基础软件创新大会通过云上展厅的形式成功召开。在微服务 & 服务治理专场,来自百度的资深研发工程师刘超带来了主题为《百度在 Service Mesh 上的大规模落地实践》的演讲,以下为主要内容。服务网格作为近几年来云原生领域的热门话题,一直受到大家的关注。百度作为一家大型的商业化互联网公司,也一直在服务网格领域进行探索,并积累了大量的生产级别的最佳实践。 本次分享,我将和大家分享以下三部分内容:服务网格简介、百
深度学习与Python
2023/03/29
4860
百度在 Service Mesh 上的大规模落地实践
服务网格和Istio初识-续
本文是服务网格和Istio初识的续篇内容,主要是漫谈(记录)一些关于服务网格、Istio的一些理论及个人认知
仙人技术
2022/01/20
3490
服务网格和Istio初识-续
译文:重磅消息 - Istio 引入 Ambient Mesh 模式
译者按:Istio 于2022年9月7日宣布了一种全新的数据平面模式 “ambient mesh”(ambient 意思是“环境的”,这里指 ambient mesh 使用了环境中的共享代理而不是 sidecar,下文直接使用英文原文),简单地讲就是将数据面的代理从应用 pod 中剥离出来独立部署,以彻底解决 mesh 基础设施和应用部署耦合的问题。该变化是 Istio 自创建以来的第二次大的架构变动,也说明 Istio 社区在持续创新,以解决 service mesh 生产中面临的实际问题。
赵化冰
2022/10/04
1.1K0
译文:重磅消息 - Istio 引入 Ambient Mesh 模式
Aeraki Mesh正式成为CNCF沙箱项目,腾讯云携伙伴加速服务网格成熟商用
6月,由腾讯云主导,联合百度、灵雀云、腾讯音乐、滴滴、政采云等多家合作伙伴发起的服务网格开源项目 Aeraki Mesh 通过了全球顶级开源基金会云原生计算基金会(CNCF)技术监督委员会评定,正式成为CNCF 沙箱项目。这意味着 Aeraki Mesh 得到了云原生开源社区的认可,而且加入 CNCF 也保证了项目的中立和开源开放,为 Aeraki Mesh 在云原生生态系统的进一步发展迈出了坚定的一步。 Aeraki Mesh 加入 CNCF 的这个时间点,恰好在 Istio 宣布将 Istio 捐赠给
腾讯云原生
2022/06/20
7230
Aeraki Mesh正式成为CNCF沙箱项目,腾讯云携伙伴加速服务网格成熟商用
Service Mesh 的未来在于网络
作者 | Bill Mulligan 译者 | 张卫滨 策划 | 丁晓昀 长期以来,服务网格(Service Mesh)一直被认为是云原生的未来,能够实现一些新的特性,比如金丝雀部署、故障转移和 mTLS,同时还能支持一些“传统的”网络特性,如流量路由、可观测性、错误处理和故障排查等。 服务网格承诺将网络安全、服务发现和渐进式的交付实践(如蓝 / 绿和金丝雀部署)转变成开发人员的自助服务接口。但是,当我们从营销炒作转到实际实现时,会发现完全不同的情况。 在最近的 CNCF 服务网格调查中,人们反映
深度学习与Python
2023/05/09
2320
Service Mesh 的未来在于网络
云原生时代的流量入口:Envoy Gateway
流量入口代理作为互联网系统的门户组件,具备众多选型:从老牌代理 HAProxy、Nginx,到微服务 API 网关 Kong、Zuul,再到容器化 Ingress 规范与实现,不同选型间功能、性能、可扩展性、适用场景参差不齐。当云原生时代大浪袭来,Envoy 这一 CNCF 毕业数据面组件为更多人所知。那么,优秀“毕业生”Envoy 能否成为云原生时代下流量入口标准组件?
深度学习与Python
2020/08/07
2.3K0
云原生时代的流量入口:Envoy Gateway
Service Mesh未来发展趋势浅析
一. Service Mesh背景及定义 2017 年底,Service Mesh依托其非侵入式特性在微服务技术中崭露头角, Service Mesh 又译作“服务网格”,作为微服务间通信的基础设施
绿盟科技研究通讯
2023/08/31
9200
Service Mesh未来发展趋势浅析
为什么 Envoy Gateway 是云原生时代的七层网关?
大家好,我叫赵化冰,是 CNCF 云原生基金会大使,也是一个软件行业老兵和云原生从业者。我还记得,当我 2017 年在 Linux 基金会下的一个开源项目中从事微服务相关工作时,第一次从该项目的一个朋友那里了解到了 Istio/Envoy。从此以后,我就被 Istio/Envoy 的先进设计理念所吸引。我是国内最早一批从事 Istio/Enovy 产品研发的技术人员之一,在 2018 年就主导了 Istio/Envoy 的第一个产品化项目。在后续的工作中,我还研发了大规模 Kubernetes 集群上基于 Envoy 的多租户七层云原生网关,创建了基于 Envoy 的多协议七层网关开源项目 MetaProtocolProxy,以及基于 Envoy/Istio 的多协议服务网格开源项目 Aeraki Mesh(CNCF Sandbox 项目),该项目被腾讯、百度、华为等多个公司采用,在基于 Envoy 的网关和服务网格上支持了超过数十种应用协议。今天,我想和大家聊一聊 Envoy 生态中的新成员 Envoy Gateway,以及为什么我认为 Envoy Gateway 是云原生时代的七层网关。
赵化冰
2023/04/22
1.5K0
为什么 Envoy Gateway 是云原生时代的七层网关?
k8s 生态周报| Istio 正式成为 CNCF 毕业项目
就在昨天 Istio 正式成为 CNCF 毕业项目了 ! 这是 Istio 发展过程中的一个重要的里程碑。
Jintao Zhang
2023/09/03
2250
k8s 生态周报| Istio 正式成为 CNCF 毕业项目
译文:Istio Ambient 模式安全架构深度解析
深入分析刚刚公布的 Istio ambient mesh(Istio 的一个无 sidecar 数据平面)对于服务网格的安全来说意味着什么。
赵化冰
2022/09/30
7240
译文:Istio Ambient 模式安全架构深度解析
eBPF 与 Wasm:探索服务网格数据平面的未来
随着 eBPF 和 WebAssembly(WASM)等轻量级运行时的发展,我们现在看到了新一代的服务网状数据平面解决方案,它们更轻便、更安全、更快速。
深度学习与Python
2022/03/23
4130
eBPF 与 Wasm:探索服务网格数据平面的未来
推荐阅读
相关推荐
Aeraki Mesh 加入 CNCF 云原生全景图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验