前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >循序渐进学Docker

循序渐进学Docker

作者头像
用户1215919
发布2021-12-28 12:42:04
2970
发布2021-12-28 12:42:04
举报
文章被收录于专栏:大大的微笑大大的微笑

docker基本用法

  • 卸载
代码语言:javascript
复制
 sudo yum remove docker \
                 docker-client \
                 docker-client-latest \
                 docker-common \
                 docker-latest \
                 docker-latest-logrotate \
                 docker-logrotate \
                 docker-engine
  • 安装
代码语言:javascript
复制
sudo yum install -y yum-utils \
 device-mapper-persistent-data \
 lvm2
 
- 设置稳定的仓库
 
  sudo yum-config-manager \
   --add-repo \
   https://download.docker.com/linux/centos/docker-ce.repo
	
	
 #安装docker
 sudo yum install docker-ce docker-ce-cli containerd.io
  • 镜像加速器
代码语言:javascript
复制
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://vxdxcg5s.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 查看镜像
代码语言:javascript
复制
docker images
  • 拉取
代码语言:javascript
复制
 ## 默认会拉取最新的,不过可以指定tags的方式拉取对应的镜像
dokcer pull hello-world(镜像名)
  • 运行
代码语言:javascript
复制
docker run --name hellodocker(别名) hello-world
  • 查看运行状态
代码语言:javascript
复制
docker ps -a
  • 删除
代码语言:javascript
复制
docker rmi -f imageId

docker rmi -f $(docker images)

## 删除容器
docker rmi -f $(docker ps -aq)
  • tomcat
代码语言:javascript
复制
# -d 后台运行
# --name 指定一个名称
# -p 将默认的8080端口映射为一个新的端口
docker run -d --name mytomcat  -p 8888:8080 tomcat

# 进入到镜像中
# 可以是containerId或者是names
docker exec -it 7940b96bcca6 /bin/bash
  • mysql
代码语言:javascript
复制
docker run -d --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --privileged mysql
### 连接不上的问题排查
docker exec -it mysql /bin/bash
mysql -uroot -p
Enter password: 
mysql> select host,user,plugin,authentication_string from mysql.user;
#host为 % 表示不限制ip localhost表示本机使用 plugin非mysql_native_password 则需要修改密码

mysql> use mysql;
mysql> alter user 'root'@'%' identified with mysql_native_password by '123';
mysql> flush privileges;
mysql> select host,user,plugin,authentication_string from mysql.user;
  • image怎么制作的
  1. Dockerfile > https://github.com/docker-library 每一个image都是根据Dockerfile配置生成的

验证

代码语言:javascript
复制
> 将官网上的mogodb的Dockerfile放入到我们的物理主机上,
并执行。
#mogodb-my 起个别名
代码语言:javascript
复制
docker build -t mogodb-my .
  1. 根据container生成image
代码语言:javascript
复制
docker commit mycentos vim-centos

通过Dockerfile可以追踪image生成的过程便于排查问题,而container的方式看不到生成的细节,所以不推荐使用,可以适当使用。

  • 查看docker占用的系统资源
代码语言:javascript
复制
docker top mytomcat
docker stats mytomcat
#限制系统资源的使用(否者会无限制消耗系统的资源)
#--memory 100M 限制内存
#--cpu-shares 10 限制CPU资源占比,例如两个container一个配置10,一个配置20那么他们两个的CPU占比应该后者是前者的两倍 即1:2
docker run -d --name mytomcat02 --memory 100M --cpu-shares 10  -p 8000:8080 tomcat
Spring Boot 项目做成image
代码语言:javascript
复制
FROM openjdk:8
MAINTAINER Bellamy.XIAO
LABEL name="demo" version="1.0" author="Bellamy.XIAO"
COPY demo-0.0.1-SNAPSHOT.jar demo-image.jar
CMD ["java","-jar","demo-image.jar"]
代码语言:javascript
复制
## build
docker build -t spring-boot-demo .
## query
docker images
## run
docker run -d --name demo -p 9000:8080 spring-boot-demo
## log
docker logs containerId
推送到远端仓库
代码语言:javascript
复制
# 生成tag:
docker tag spring-boot-demo  7634xxx/spring-boot:v1.0
# 官方仓库: https://hub.docker.com
登录: docker login
tag: docker tag ImageId  7634xxx/spring-boot :v1.0
push: docker push   7634xxx/spring-boot:v1.0

# 阿里云仓库
登录: sudo docker login --username=xxxx  registry.cn-hangzhou.aliyuncs.com

tag:  sudo docker tag ImageId registry.cn-hangzhou.aliyuncs.com/docker-namesapce/docker-repository:version

push : sudo docker push registry.cn-hangzhou.aliyuncs.com/docker-namesapce/docker-repository:version

# 私服[harbor]: https://github.com/goharbor/harbor
系统资源监控平台[weaveworks/scope]
代码语言:javascript
复制
#下载
sudo curl -L git.io/scope -o /usr/local/bin/scope  
#授权
sudo chmod a+x /usr/local/bin/scope
#启动(可以有多个ip)
scope launch 192.0.0.1
#停止
scope stop
Docker核心部分->从网络说起网络
Docker 中的网络模式
代码语言:javascript
复制
#通过如下命令查看
docker network ls
NETWORK ID          NAME                DRIVER               SCOPE
15ea9d89d616        bridge              bridge               local
1c62b0fd4212        host                host                 local
375f1ab17a8b        none                null                 local
  1. bridge
  • 默认使用的方式 2.host
  • 访问容器不需要进行映射直接可以访问
  1. none
  • 只有一个本地网卡信息
代码语言:javascript
复制
#创建,默认为bridge
docker network create  net01

#通过如下命令可以得到具体信息
docker network inspect net01

信息如下:
[
   {
       "Name": "net01",
       "Id": "b9fee626fdee",
       "Created": "2019-12-19T10:50:59.641869093Z",
       "Scope": "local",
       "Driver": "bridge",
       "EnableIPv6": false,
       "IPAM": {
           "Driver": "default",
           "Options": {},
           "Config": [
               {
                   "Subnet": "x.0.0.0/16",
                   "Gateway": "x.x.x.x" #网关信息
               }
           ]
       },
       "Internal": false,
       "Attachable": false,
       "Ingress": false,
       "ConfigFrom": {
           "Network": ""
       },
       "ConfigOnly": false,
       "Containers": { # 容器信息
           "c0f8db51792b9b394b": {
               "Name": "tomcat03",
               "EndpointID": "9a966183a87",
               "MacAddress": "",
               "IPv4Address": "x.x.x.x/16",
               "IPv6Address": ""
           }
       },
       "Options": {},
       "Labels": {}
   }
]

这是否意味着我们可以通过上述三种方式自定义网络

代码语言:javascript
复制
# 重新启动一个容器,命令如下
docker run -d --name tomcat03 --network net01 -p 8082:8080 tomcat
#可以对比容器使用network参数与未使用的ip变化

神奇的是在tomcat03中此刻却无法ping通使用了docker默认的network创建的tomcat01容器。 原因在于自定义的网络跟docker0不在同一个网段所以无法ping通(tomcat03使用的是自定义网络,而tomcat01使用的则是默认的网络),那么tomcat03和tomcat01当然无法ping通。

代码语言:javascript
复制
# 查看当前docker默认的bridge
docker inspect bridge
[
   {
       "Name": "bridge",
       "Id": "15ea9d89d6165304b561b",
       "Created": "2019-12-19T10:43:46.750789678Z",
       "Scope": "local",
       "Driver": "bridge",
       "EnableIPv6": false,
       "IPAM": {
           "Driver": "default",
           "Options": null,
           "Config": [
               {
                   "Subnet": "x.x.0.0/16",
                   "Gateway": "x.x.x.x"
               }
           ]
       },
       "Internal": false,
       "Attachable": false,
       "Ingress": false,
       "ConfigFrom": {
           "Network": ""
       },
       "ConfigOnly": false,
       "Containers": { #可以看到默认网络的容器信息
           "44371744ca1a": {
               "Name": "tomcat01",
               "EndpointID": "7005e8d9f9aab442",
               "MacAddress": "",
               "IPv4Address": "x.x.x.x/16",
               "IPv6Address": ""
           }
       },
       "Options": {
           "com.docker.network.bridge.default_bridge": "true",
           "com.docker.network.bridge.enable_icc": "true",
           "com.docker.network.bridge.enable_ip_masquerade": "true",
           "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
           "com.docker.network.bridge.name": "docker0",
           "com.docker.network.driver.mtu": "1500"
       },
       "Labels": {}
   }
]

# 将tomcat01也加入到自定义网络中
docker network connect net01 tomcat01
#再次查看net01发现tomcat01也在当中了

# 通过如下命令查看tomcat01的网络信息发现tomcat01中的网络此时多了一个ip地址
docker inspect tomcat01
#此时tomcat01和tomcat03因为有同网段的ip地址,所以又可以互通

结论: 为什么容器之间能够相互连通,是因为docker会创建这种桥接模式,而桥接模式实际上是使用了veth-pair技术,所以容器之间可以进行通信。

container之间是否可以通过名称互通

如果真的可以那么就不需要担心ip地址的变化了,就像微服务一样,服务与服务之间的调用通过注册咋注册中心上的服务名字即可调用。遗憾的是我们在使用默认的docker网络是无法用名字的方式ping通

代码语言:javascript
复制
#增加link的方式进行指定
docker run -d --name tomcat05 --link tomcat01 -p 8085:8080 tomcat
	 
# 自定义网络的方式是可以互通的
多机通信overlay网络
  • Swarm中实现
代码语言:javascript
复制
# 创建一个overlay网络
docker network create -d overlay o-net

#创建mysql
docker service create --name mysql -v v1:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=db_wordpress --network o-net mysql:5.6

#创建wordpress
docker service create --name wordpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network o-net wordpress

#查看网络信息
docker network inspect o-net
[
    {
        "Name": "o-net",
        "Id": "45x28fm6",
        "Scope": "swarm",
        "Driver": "overlay",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": 
                    "Gateway": 
                }
            ]
        },
        "Containers": {
            "64cf17fd1f0": {
                "Name": "mysql.1.s1hfbsju",
                "EndpointID": 
                "MacAddress": 
                "IPv4Address":
            },
            "lb-overlay-net": {
                "Name": "overlay-net-endpoint",
                "EndpointID": ,
                "MacAddress":,
                "IPv4Address": ,
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4097"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": 
                "IP": 
            },
            {
                "Name":
                "IP": 
            }
        ]
    }
]
docker持久化
  • volume
代码语言:javascript
复制
 # 查看,创建容器的时候会自动生成一个默认的volume
 docker volume ls
 
 DRIVER              VOLUME NAME
local               1deb0814c8723496c03aacecbe0535e47f39e1131286f3c0d1090eb8717617e8
local               3a7e9642878f96afe5b307b39dc184aad6f0ea379e53592b989e2d513a44c6b9
local               6f4e05e55601c866a614dd60b05386763e8081b93465472adbdceef5a1a2c60a

如上所示 VOLUME NAME太长不容易记忆
在创建容器的时候可以指定 -v
docker run -d --name mysql -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123  mysql

DRIVER             VOLUME NAME
local               mysql

# 查看详情
docker volume inspect mysql
[
   {
       "CreatedAt": "2019-12-23T06:40:53Z",
       "Driver": "local",
       "Labels": null,
       "Mountpoint": "/var/lib/docker/volumes/mysql/_data",
       "Name": "mysql",
       "Options": null,
       "Scope": "local"
   }
]

# 测试是否能够持久化
1.创建一个数据库tester
2. 退出容器并删除容器
3.查看volume发现,volume并不会随着容器的删除而删除
4.执行命令:docker run -d --name mysql -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123  mysql(volume属性指向之前创建的volume->mysql)
docker run -d --name mysql -p 3306:3306 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --net net-cluster  mysql:latest --log-bin=mysql-bin --binlog-format=ROW --server_id=101(甚至可以直接修改my.cnf)
5.进入mysql并show databases;发现之前创建的数据库还在。
  • Bind Mounts
代码语言:javascript
复制
# 1. 创建一个文件 /usr/local/web/1.html
内容: <h1>hello</h1>

#2. 挂载并运行:docker run -d --name tomcat -p 8888:8080 -v 
/usr/local/web/:/usr/local/tomcat/webapps/web/ tomcat
或者
docker run -d --name tomcat02 -p 9000:8080 --mount type=bind,source=/usr/local/web/,target=/usr/local/tomcat/webapps/web/  tomcat

#3.访问http://ip:8888/web/1.html查看内容

#4.进入到Tomcat中查看,会发现有个一样的目录和文件。

#5.再次修改物理机中的1.html
加入内容<h2>Docker</h2>
#6.重新访问浏览器会发现内容的变化
Docker容器管理

如果使用命令行的方式,需要每次先创建自定义网路、挂载等再一个个的启动运行容器相对来说比较麻烦,下面来看看Docker容器管理。

单机版多容器管理

集群版多容器管理 manager: work(2个):

查看集群信息
代码语言:javascript
复制
docker node ls

ID                        HOSTNAME     STATUS    AVAILABILITY  MANAGER STATUS      ENGINE VERSION
k2bfj4ipf63u *   node1      Ready      Active    Leader         19.03.4
lf9i7sj17u5b     node2      Ready      Active                   19.03.4
69tfr9cq6j61     node3      Ready      Active                   19.03.4
节点升/降级
代码语言:javascript
复制
#示例命令:
docker node promote node2

docker node demote  node2
创建一个Tomcat
代码语言:javascript
复制
 docker service create --name tomcat -p 8080:8080  tomcat
查看swarm的services
代码语言:javascript
复制
#命令:
docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
qy870rkl            tomcat              replicated          1/1                 tomcat:latest       *:8080->8080/tcp
查看service的启动日志
代码语言:javascript
复制
docker service logs tomcat
查看在哪个node中运行
代码语言:javascript
复制
docker service ps tomcat
扩展service
代码语言:javascript
复制
docker service scale tomcat=3
自动恢复
代码语言:javascript
复制
# 删除其中一个容器
docker rm -f bfaxc6smw
#查看
$ docker service ps tomcat
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR                         PORTS
50000saiypxh        tomcat.1            tomcat:latest       node2               Running             Running 30 minutes ago                                 
3x4bfaxc6smw        tomcat.2            tomcat:latest       node3               Running             Running 19 minutes ago                                 
vicrsu2aebud         \_ tomcat.2        tomcat:latest       node3               Shutdown            Failed 19 minutes ago    "task: non-zero exit (137)"   
ot50dhj0b1at        tomcat.3            tomcat:latest       node1               Running             Running 23 minutes ago   
删除service
代码语言:javascript
复制
docker service rm tomcat
# 再次查看
docker service ls
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Boot 项目做成image
  • 推送到远端仓库
  • 系统资源监控平台[weaveworks/scope]
  • Docker核心部分->从网络说起网络
    • Docker 中的网络模式
    • container之间是否可以通过名称互通
    • 多机通信overlay网络
    • docker持久化
    • Docker容器管理
      • 查看集群信息
        • 节点升/降级
          • 创建一个Tomcat
            • 查看swarm的services
              • 查看service的启动日志
                • 查看在哪个node中运行
                  • 扩展service
                    • 自动恢复
                      • 删除service
                      相关产品与服务
                      容器服务
                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档