Docker 安装和容器部署服务

楚江云 · · 420 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1. Docker是什么?

在互联网时代人们对美好生活的追求驱动下,大量的应用和服务被创建了出来,这些应用和服务通常都部署不同服务器上.一切看上去都是那样的美好

然而....

这些应用和服务的开发运维人员表示:"宝宝心里苦"

情况是在一个IT部门可能技术栈比较丰富,有C/C++的,java的,PHP的,Python的,Golang 的,JS 的等等,为此在不得不配置大量的复杂的不同的环境,另外不同的应用和服务依赖的版本可能不同,又是一个令人脑阔大的问题,另外在业务扩展的时候可能又要购买新的服务器再次部署环境和应用,但是原有的服务器本身的服务负载可能也不高....

那有没有比较好的解决方法呢?

1.1 旧的解决方案?

虚拟机(VM)的出现为上述种问题提供解决方案,虚拟机就是在操作系统(OS)的基础上再模拟运行一个操作系统,运行虚拟机本身需要占用较多的系统资源(CPU,RAM,磁盘空间等),而且VM自身运行起来的速度还很慢,移植性也不是很完善

1.2 新的解决方案?

VM 的解决方案面临的问题很多,那么自然出现的更好的解决方案那就是Docker

  • Docker发展出来是基于linux 容器(Linux Containers ,LXC)
  • Docker的出现使容器技术更加普遍化,能让更多的人享受容器技术带来的红利

Docker的特点:

  • 提供各种开发测试环境,不要大量的部署安装软件,几个命令就可以部署一个完整的运行环境
  • 更高效的资源利用,运行起来一个容器本身依赖的资源就很少,在同一主机上可以运行多个容器,容器之间是相互隔离的
  • 更便捷的迁移和扩展,Docker几乎能运行在所有平台上,容器化的应用可以实现很方便的扩展
  • 管理方便

1.3 Docker容器 VS 虚拟机技术

Docker-vs-VM.png

运行容器运行的情况

Docker结构.png

虚拟机运行情况

VM结构.png
  • 虚拟机是可以说是将硬件资源划分为虚拟资源,并且让这些虚拟资源看起来和真是的物力资源一样,然后Hypervisor将这些资源打包进一个叫做虚拟机的软件结构中,我们再在虚拟机中安装系统和应用
  • 容器可以理解为操作系统虚拟化,在操作系统上容器引擎获取系统资源,将系统资源分割成相互隔离的结构的资源结构便是单个的容器

2. 如何安装?

2.1 安装步骤

安装Docker的操作系统是 CentOS7

2.1.1 移除旧的Docker版本

PS : 如果压根没有安装过docker这步不需要执行

# 方法1 (非root用户需要提权)
# PS : 本身是root用户在执行命令的,不要带上sudo
[root@host1 ~]# yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-engine
Loaded plugins: fastestmirror
No Match for argument: docker
No Match for argument: docker-client
No Match for argument: docker-client-latest
No Match for argument: docker-common
No Match for argument: docker-latest
No Match for argument: docker-latest-logrotate
No Match for argument: docker-logrotate
No Match for argument: docker-engine
No Packages marked for removal
2.1.2 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2.1.3 设置yum源
[root@host1 ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
2.1.4 查看可用版本
# 这一步不是必须的,如果你想安装指定的docker版本可以通过该步骤查看可用版本
# 罗列当前docker能用的所以版本
[root@host1 ~]# yum list docker-ce --showduplicates | sort -r
 * webtatic: uk.repo.webtatic.com
 * updates: mirror.bit.edu.cn
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
 * extras: mirrors.aliyun.com
 * epel: ftp.iij.ad.jp
docker-ce.x86_64            3:19.03.9-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.8-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.7-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.4-3.el7                     docker-ce-stable
....
2.1.5 安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
# 或者执行(效果是一样的)
sudo yum install docker-ce
# 安装完成之后启动docker
systemctl start docker
# 查看docker是否安装成功
[root@host1 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.12
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        48a66213fe
 Built:             Mon Jun 22 15:46:54 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:45:28 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

# 出现如上信息就表示安装成功了(分别打印的是docker客户端和服务端的基础信息)
2.1.6 启动docker
# 加入开机启动
systemctl enable docker
# docker 默认只能通过root权限执行,通过将用户添加到docker用户组可以避免(直接root用户操作可以无视),执行之后重新登录
sudo usermod -aG docker $USER
2.1.7 配置docker的源

配置docker源是为了更快的速度拉取镜像,docker默认使用的国外的镜像(相对国内而言)

#创建或者打开 /etc/docker/daemon.json 文件
#国内可用的镜像有很多我们简单罗列几个
# Azure中国   https://dockerhub.azk8s.cn
# 中科大      https://docker.mirrors.ustc.edu.cn
# 七牛云      https://reg-mirror.qiniu.com
# 网易云      https://hub-mirror.c.163.com
# 腾讯云      https://mirror.ccs.tencentyun.com 
# 任意选取一个国内镜像即可
vi /etc/docker/daemon.json

{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ]
}
# 编辑完 daemon.json 文件之后退出保存
# 然后重启docker服务使之生效
sudo systemctl daemon-reload
sudo systemctl restart docker
2.1.8 安装docker-compose

docker-compose

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有的服务

# 下载docker-composer二进制文件
[root@host1 ~]# curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   651  100   651    0     0    233      0  0:00:02  0:00:02 --:--:--   233
100 16.3M  100 16.3M    0     0   120k      0  0:02:19  0:02:19 --:--:-- 98550
# 赋予二进制文件可执行权限
[root@host1 ~]# chmod +x /usr/local/bin/docker-compose
# 创建软链接,使docker-composer称为一个可执行的命令
[root@host1 ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证
[root@host1 ~]# docker-compose --version
docker-compose version 1.25.4, build 8d51620a

3. docker常用命令

3.0 Docker帮助命令

# 打印docker版本信息
docker version 
# 打印docker的概览信息
docker info
# 打印docker帮助信息
docker help
docker --help
# 打印docker命令帮助信息
docker 命令 --help

3.1 镜像常用命令

Docker仓库的类似github的作用,Docker仓库是用来存放Docker镜像的地方

镜像是docker一个核心概念 ,镜像image 是一个二进制文件,镜像可以通过层层叠加其他的镜像和一些设置形成新的镜像.docker中的镜像是生成容器的模板,通过一个镜像可以创建多个同类型服务的容器实例

# 搜索镜像
docker search [OPTIONS] TERM
# 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 列出拉取的所有镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
docker image list
# 删除一个或者多个镜像 
# 注意:当镜像有关联容器(处于Up或者Exited)时,不能直接删除 
docker image rm [OPTIONS] IMAGE [IMAGE...] 
# 删除一个或者多个镜像 
docker rmi [OPTIONS] IMAGE [IMAGE...]
# 显示镜像的详细信息
docker image inspect [OPTIONS] IMAGE [IMAGE...]

3.2 容器常用命令

Docker容器我们在感官上可以认为它就是一个sandbox , 用来运行和隔离提供的服务

Docker容器是根据Docker镜像创建的具体实例.

# 启动一个新容器
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 列出所有运行的容器
docker container ls [OPTIONS]
docker ps [OPTIONS]
# 连接到一个运行的容器中 (进入运行的容器中)
docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
# example 
docker container exec -it 容器ID(容器名) /bin/bash #进入容器中 
# 停止一个或者多个容器
docker container stop [OPTIONS] CONTAINER [CONTAINER...]
docker kill 容器id
docker stop 容器id
# 将一个停止的容器启动
docker container start [OPTIONS] CONTAINER [CONTAINER...]
docker start 容器id 
# 重启一个容器
docker restart 容器id 
# 删除停止的容器(先停止后才能删除)
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 显示容器的配置信息和运行信息
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
# 更新容器的配置
docker update [OPTIONS] CONTAINER [CONTAINER...]
# example :
docker update --restart=always 容器名(或者容器id) # 将该容器设置为自动启动
# 查看容器的端口映射
docker container port CONTAINER [PRIVATE_PORT[/PROTO]]
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
# 查看容器日志
docker logs [OPTIONS]  容器id
# 容器与主机之间的数据拷贝
#---从容器拷贝到主机
# docker cp 容器id:容器源文件目录 主机路径
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|
#---从主机拷贝到容器
# docker cp 主机目录 容器id:容器源文件目录
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 查看容器的运行统计状态
docker stats 容器名或者容器id

4. Docker容器部署服务

4.1 容器部署Nginx

# 拉取nginx镜像,不指定版本时,默认是latest(最新版)
docker pull nginx
# docker启动一个nginx服务
docker run -p 8080:80 --name nginx1 \
-v /data/wwwlog:/var/log/nginx \
-v /data/wwwroot/:/usr/share/nginx/html/ \
-v /var/local/nginx:/etc/nginx \
-d nginx
# 参数解释
-p 8080:80 # 指定端口映射 ip:主机端口:容器端口 
--name nginx1 #给容器起别名,便于区分
-v /data/wwwwlog:/var/log/nginx # 卷挂载 宿主机目录:容器内部路径
-d # 后台运行该容器

4.2 容器部署Mysql

4.2.1 mysql5.7
# pull mysql镜像 (指定的mysql5.7的镜像)
docker pull mysql:5.7.28
# 启动容器
docker run -p 3306:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.28
# 参数解释
-e MYSQL_ROOT_PASSWORD=123456 #容器的环境配置,此处是配置mysql的root密码
# mysql容器内连接测试
docker exec -it mysql1 /bin/bash
# 进入mysql容器内部
root@2d33a806f8d4:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, 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> 
mysql> 
mysql> 
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.28    |
+-----------+
1 row in set (0.00 sec)

mysql> 
mysql> exit
Bye
#====================================
# mysql外部链接测试(可以是数据库链接工具)或者是mysql客户端
# 在客户机器上执行如下命令 (windows10 PowerShell)
PS C:\Users>mysql -h 192.168.30.44 -P 3306 -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, 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> select version();
+-----------+
| version() |
+-----------+
| 5.7.28    |
+-----------+
1 row in set (0.00 sec)

mysql> exit;
Bye

4.2.2 mysql8
# pull mysql最新的镜像(latest)
docker pull mysql
#启动一个容器 (端口映射了3307)
docker run -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
# 配置
# 容器内链接测试
docker exec -it mysql2 /bin/bash
root@1a5fadeb2de7:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, 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> select version();
+-----------+
| version() |
+-----------+
| 8.0.17    |
+-----------+
1 row in set (0.00 sec)

mysql> exit
Bye
root@1a5fadeb2de7:/# exit
exit
# 其他客户端连接mysql容器
# 还是在window PowerShell测试
PS C:\Users> mysql -h 192.168.30.44 -P 3307 -u root -p
Enter password: ******
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: 找不到指定的模块。
# 主要原因是mysql8采用新的加密模式,导致客户端连接失败
# 解决方法如下
# 进入mysql容器内
[root@host5 local]# docker exec -it mysql2 /bin/bash
root@1c2a3fbedd11:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, 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> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> 
# 退出容器
#====================================
# 继续在客户端测试mysql8连接
PS C:\Users> mysql -h 192.168.30.44 -P 3307 -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2016, 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> select version();
+-----------+
| version() |
+-----------+
| 8.0.17    |
+-----------+
1 row in set (0.00 sec)

mysql> exit
Bye
PS C:\Users>
4.2.3 mysql挂载目录
# pull mysql镜像 (指定的mysql5.7的镜像)
docker pull mysql:5.7.28
# 启动容器 分别挂载配置,日志,数据卷
docker run -p 3308:3306 --name mysql3 \
-v /usr/local/docker-data/mysql/conf/:/etc/mysql/conf.d \
-v /usr/local/docker-data/mysql/logs/:/var/log/mysql \
-v /usr/local/docker-data/mysql/data/:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.28
# 需要挂载那些目录根据自己的需求决定
# PS 如果挂载了mysql的配置文件目录那么需要在docker主机的挂载容器配置文件目录中添加配置文件
4.2.4 mysql远程登录问题
  1. mysql容器允许远程连接权限 ?

    # 进入容器
    docker exec -it 容器名或者容器id /bin/bash
    # 在mysql容器内登陆mysql
    mysql - u root -p
    MySQL> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
    Query OK, 0 rows affected, 1 warning (0.05 sec)
    
    MySQL> flush privileges;
    Query OK, 0 rows affected (0.05 sec)
    
    MySQL> 
    
  1. mysql8镜像的容器远程连接认证问题?ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: 找不到指定的模块。

    # 进入容器
    docker exec -it 容器名或者容器id /bin/bash
    # 在mysql容器内登陆mysql
    mysql - u root -p
    # 命令解析: 修改任意ip通过root用户登陆的加密规则为 mysql_native_password 
    MySQL> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    Query OK, 0 rows affected, 1 warning (0.05 sec)
    
    MySQL> flush privileges;
    Query OK, 0 rows affected (0.05 sec)
    
    MySQL> 
    
  2. mysql 创建账户分配权限?

    mysql 数据权限分配语句

    1. 创建账户语句

      CREATE USER 'username'@'host' IDENTIFIED BY 'password';
      
    1. 授权语句

      GRANT privileges ON databaseName.tableName TO 'username'@'host'
      参数说明 : 
      privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
      databasename.tablename : 允许操作的数据库及表,如果是所有库,就用 *.* 标识
                              如果是允许对库中的所有表都可以操作,就用 databaseName.*
      example1:
      GRANT all ON *.* TO 'zhangsan'@'%' # 允许操作所有库
      example2:
      GRANT select,insert ON crm_core.user TO 'zhangsan'@'%' # 允许对crm_core的user表执行查找和添加操作
      
    1. 修改账户密码语句

      SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
      
    1. 删除账户语句

      DROP USER 'username'@'host';
      
    # 进入容器
    docker exec -it 容器名或者容器id /bin/bash
    # 在mysql容器内登陆mysql
    mysql - u root -p
    # 新建一个zhangsan的账户设置密码是123456
    mysql> CREATE USER 'zhangsan'@'%' IDENTIFIED BY '123456';
    Query OK, 0 rows affected (0.00 sec)
    # 授权
    # 赋予zhangsan对数据cdr_core所有权限
    mysql> grant all on cdr_core.* to 'zhangsan'@'%';
    Query OK, 0 rows affected (0.00 sec)
    mysql> exit
    Bye
    root@7a497f5b280e:/# exit
    exit
    # 客户端测试权限分配
    PS C:\> mysql -h 192.168.30.44 -P 3308 -u zhangsan -p
    Enter password: ******
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 11
    Server version: 5.7.28 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2016, 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 |
    | cdr_core           |
    +--------------------+
    2 rows in set (0.00 sec)
    
    mysql>
    

4.3 容器部署RabbitMQ

# 拉取rabbitMQ 镜像
docker pull rabbitmq:3.8.2-management-alpine
# 查看镜像
docker images |grep rabbitmq
rabbitmq              3.8.2-management-alpine   31821c907973        8 months ago        141MB
# 简单启动RabbitMQ 
# 简单启动一个rabbitmq容器后,通过ip:端口访问 RabbitMQ的UI管理界面,默认账户密码是guest
docker run --name rabbitmq1 -d -p 5672:5672 -p 15672:15672 31821c907973
# 启动RabbitMQ,挂载数据卷,并设置密码
docker run -d --name rabbitmq2 -p 5673:5672 -p 15673:15672 -v /usr/local/docker-data/rabbitmq/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 31821c907973
#====================================
# 测试在浏览器中输入ip:15673 就可以看到RabbitMQ的登陆界面
rabbitmq1.png
rabbitmq2.png

4.4 容器部署Redis

# pull redis镜像
docker pull redis
# 查看镜像
docker images |grep redis
redis                 latest                    dcf9ec9265e0        9 months ago        98.2MB
# 简单启动一个redis容器
docker run -d --name redis1 -p 6379:6379 dcf9ec9265e0
# 启动一个redis容器并设置密码为123456
# --requirepass 设置redis密码
docker run -d --name redis2 -p 6380:6379 dcf9ec9265e0 --requirepass '123456'

# 启动一个挂载数据盘的redis容器
# --appendonly yes 开启redis持久化
docker run -d --name redis3 -p 6381:6379 -v /usr/local/docker-data/redis/data:/data dcf9ec9265e0 --requirepass '123456' --appendonly yes
#====================================
# docker部署redis容器的服务器ip是 192.168.30.44
# redis客户端连接测试redis容器
# 测试环境 windows10 (PowerShell)
# 测试软件 redis-cli.exe
PS C:\Program Files\Redis> .\redis-cli.exe -h 192.168.30.44 -p 6379
192.168.30.44:6379>
192.168.30.44:6379> set name redis1
OK
# 测试需要密码连接的redis
PS C:\Program Files\Redis> .\redis-cli.exe -h 192.168.30.44 -p 6380
192.168.30.44:6380> keys *
(error) NOAUTH Authentication required.
192.168.30.44:6380> auth 123456
OK
192.168.30.44:6380> set name redis2
OK
192.168.30.44:6380> get name
"redis2"

# redis桌面客户端工具也可测试,如:Another Redis Desktop Manager,RedisDesktopManager 等

参考文档

- [1] Linux系统安装Docker

- [2] DockerHub


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:楚江云

查看原文:Docker 安装和容器部署服务

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

420 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传