Docker

docker介绍

Docker是一个客户端-服务器(C/S)架构程序。本质上是通过go语言对lxc技术的一个封装,遵守Restful规范

docker hub注册一个账号(用来拉取镜像):https://hub.docker.com/

docker分为docker-ce(免费)和docker-ee(收费)

# 各种软件用什么语言写的
zabbix(监控软件):php
ansible(批量管理主机,执行命令,无angent):python
openstack(云计算,管理虚拟机):python
jekins(ci/di):自动化部署,java
salstack(批量管理主机,执行命令,有angent):python
普罗米修斯(Prometheus,监控):go写的
docker:go
k8s:go # 虚拟化
vmware,kvm,openstack,docker,k8s
云服务器:vmware,kvm虚拟化出来的
阿里云,腾讯云:opensatck,阿里飞天,用来管理虚拟化出来的操作系统
docker:进程级别的隔离,装在虚拟机,云服务器上,一个云服务上开业跑出成几百个docker容器
k8s:管理不同机器的上万个容器
虚拟化:打破实体结构间的不可切割的障碍 # 两个重要概念
镜像(image)与容器(container)

docker架构图

docker安装

Docker 的安装包以及周边高速镜像:http://get.daocloud.io/

centos上安装(7.0以上)

# 0.卸载(纯净环境直接跳过)
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
# 1.更新yum
yum update -y
# 2.安装需要的软件包,yum-util
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3.执行(向你的yum源,增加一条记录)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4.安装
yum install docker-ce -y
# 5.验证安装(查看版本)
docker -v # 自从分了docker-ce和docker-ee以后,开始以年份命名版本(Docker version 23.0.1, build a5ee5b1)
# 6.启动docker服务
systemctl start docker
# 7.停止docker服务,重启docker服务
systemctl stop docker
systemctl restart docker
# 8.开机启动
systemctl enable docker
# 9.查看概要信息
docker info """docker info命令最后两行警告"""
...
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决办法:(相当于在vim /etc/sysctl.conf文件里新增两行)
echo 'net.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.conf
echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.conf
查看配置是否生效:sysctl -p|grep 'net.bridge'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
重启docker:systemctl restart docker
重新校验:docker info

远程仓库

# 注册,登录 https://hub.docker.com/
# 可以上传和下载镜像(类似于github)
# 配置加速(换源)
vim /etc/docker/daemon.json
# 复制粘贴一定要正确,少了东西docker会报错Failed to start Docker Application Container Engine.
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ghcr.io",
"https://mirror.baidubce.com"
]
}
# 自用:https://571wq2ml.mirror.aliyuncs.com

镜像操作

基本操作

# 查找镜像
https://hub.docker.com/
or
docker search xxx
# 拉取镜像
docker pull hello-world # 默认最新版本latest
docker pull hello-world:指定版本
# 查看机器上的镜像
docker images
# 删除镜像
docker rmi 镜像名字/id号 # 如果还有基于这个镜像的容器,是不允许删除镜像的,先删除容器,再删除images
# 镜像重命名
docker tag 镜像id 仓库(镜像名字):标签 # docker tag 4f06 mysql:mysql8.0.32
or
docker tag 旧镜像名 新镜像名 #

阿里云操作

阿里云容器镜像实例地址:https://cr.console.aliyun.com/cn-hangzhou/instances

# 登录
docker login --username=hkwjsxl registry.cn-hangzhou.aliyuncs.com
# 将镜像推送到Registry
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:[镜像版本号]
# 从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:[镜像版本号]

示例

# 安装python,mysql,redis,nginx,centos7
1.拉取
docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:python39
docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:mysql8.0.32
docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:redis7
docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:nginx1.23.3
docker pull registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:centos7
2.重命名
docker tag 4f06 mysql:mysql8.0.32
...
3.删除原来的
docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:python39
docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:mysql8.0.32
docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:redis7
docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:nginx1.23.3
docker rmi registry.cn-hangzhou.aliyuncs.com/hankewei/hkwimage:centos7

容器操作

# 0.docker run 镜像 如果本地没有,会先pull,再run
# 1.删除容器
docker rm 容器名字/容器id
# 2.启动并运行容器
docker run -di --name=lcentos centos:centos7 # 打印出的是容器的id号
# 3.查看机器上正在运行的容器
docker ps
# 4.查看宿主机上所有的容器(包括停止的)
docker ps -a
# 5.停止容器
docker stop 容器名字/id号
# 6.启动容器
docker start 容器id/名字
# 7.容器的创建和启动(******)
创建:
docker create --name=lcentos centos:centos7 ps -A
启动
docker start lcentos
# 容器一直运行的原因
它有一条前台进程,一直在运行
以后如果自己制作的镜像,运行起容器,必须有个可以夯住的命令
如果该命令结束,该容器也就结束了
# 参数
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
--name :为创建的容器命名。如果不写,会自动分配一个名字(英文人名)
-v:表示目录映射关系(前者是宿主机目录,后者是容器目录,映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
# 8.进入容器的几种方式(并不是真进入)
第一种:
docker exec -it 容器id/容器名字 /bin/bash
docker exec 容器id/容器名字 ls
# exec真正的作用是在容器内执行命令
第二种:ssh连接(容器内部装ssh服务端)
# 9.退出
exit
# 10.文件拷贝
从宿主机拷贝到容器内部
docker cp t1.txt 容器id/容器名字:/home
从容器内部拷贝到宿主机
docker cp 容器id/容器名字:/home/t1.txt /home
# 11.目录挂载(一旦挂载,以后宿主机目录内修改,同样影响容器内部,反过来也是)
docker run -di --name=lcentos -v /home/:/home/ centos:centos7
# 12.端口映射
docker run -di --name=lredis -p 6666:6379 redis:redis7
# 13.查看容器详细信息
docker inspect 容器id/容器名字
# 查看ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称/

其他操作

# 查看容器运行日志
docker logs 容器id/名字
# 设置开机重启
--restart=always
# 启动所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
# 关闭所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
# 删除所有容器
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
# 删除所有镜像
docker rmi $(docker p_w_picpaths | awk '{print $3}' |tail -n +2)
# 重启所有容器
docker restart $(docker ps -a | awk '{ print $1}' | tail -n +2)
# 删除所有与当前docker-compose.yml文件有关的镜像额容器
docker-compose -f docker-compose.yml down --rmi all -v
# 容器与镜像存放目录
镜像位置: /var/lib/docker/image
容器位置: /var/lib/docker/containers

应用部署

部署redis详解

redis配置下载地址

https://redis.io/docs/management/config/

部署应用并映射外部目录(redis)

# 部署redis,把配置文件和数据目录映射出来
# 操作步骤
# 1.创建目录
cd /home/
mkdir redis redis/conf redis/data
# 2.下载redis配置文件(7版本)
cd /home/redis/conf/
wget https://raw.githubusercontent.com/redis/redis/7.0/redis.conf
# 下载如果报错:Unable to establish SSL connection.
# 解决方式1:加上参数--no-check-certificate
# 解决方式2:加上参数--user-agent="" (有些网站不允许通过非浏览器的方式进行下载,使用代理即可)
# 在尾部新增以下内容(:$可以直接到尾部)
bind 0.0.0.0
daemonize no
requirepass root123456
# 参数详解
"""
使redis可以外部访问
用守护线程的方式启动,这里是通过docker部署,所以选择no
给redis设置密码
"""
# 3.创建并运行容器
docker run -p 6666:6379 --name lredis -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data -di redis:redis7 redis-server /etc/redis/redis.conf
"""
# docker ps看一下是否运行起来,如果是一启动就立即停止了,执行命令docker logs 容器id 查看一下日志,
# 可能是因为配置文件里面的注释的原因,删除掉注释后成功启动,还有的情况是没有权限,启动时加上`--privileged=true`即可,其余报错看自己情况
"""
# 4.本地机器上远程连接到了docker里的redis
# 5.cmd窗口下(虚拟机的话是虚拟机的地址而不是生成的redis容器的地址)
# 如果外部无法访问,关闭防火墙,重启docker,再重启容器
redis-cli -h 10.0.0.10 -p 6666
# 6.认证
auth root123456
# 7.写入数据
set name 111
# 8.保存数据
save(直接夯在那)或者是bgsave(后台保存)
# 9.在宿主机的/home/redis/data路径下就能看到一个文件,不管多少次重启redis容器,数据都还在,如果原来的redis容器没了,按照第三步再启动一遍,数据也都还在

redis容器一启动就立即停止报错原因截图

部署mysql

# 创建目录
# 创建存放MYSQL配置文件目录,创建存放MYSQL数据存放目录,创建存放MYSQL日志存放目录
mkdir -p /home/mysql/conf/ /home/mysql/data/ /home/mysql/logs/
# 启动
docker run -di --name=lmysql -p 7777:3306 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf/:/etc/mysql/conf.d -v /home/mysql/logs/:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root123456 mysql:mysql8.0.32
# 测试连接
docker exec -ti lmysql /bin/bash
mysql -uroot -p
root123456
# 查看MySQL ip
select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;
# 查看端口号
show global variables like 'port';

迁移与备份

# 容器保存为镜像
docker commit 容器名字/id 镜像名字
# 把镜像打包成压缩包
docker save -o xxx.tar xxx
# 把压缩包回复为镜像
docker load -i xxx.tar # 操作步骤
1.启动一个python容器
docker run -di --name=lpython39 python:3.9
2.进入装软件
docker exec -it lpython39 /bin/bash
mkdir /project
pip install django==3.2.26
exit
3.把项目拷贝到容器内部
docker cp /home/django_project /project
4.把容器做成镜像
docker commit lpython39 django_project
5.基于自己做的镜像运行容器
docker run -di --name=ldjango_project -p 8088:8088 django_project python /project/manage.py runserver 0.0.0.0:8088

dockerfile

介绍

dockerfile就像一个文件,里面一堆指令,通过这个文件可以生成镜像

指令

FROM image_name:tag  # 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name # 声明镜像的创建者
ENV key value # 设置环境变量 (可以写多条)
RUN command # 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file # 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file # 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir # 设置工作目录

dockerfile部署Django项目并配置均衡负载

# 1.创建目录并进入
mkdir –p /home/luffyapi/
cd /home/luffyapi/
# 2.拉取项目
git clone https://github.com/HkwJsxl/LuffyAPI.git luffyapi
# 3.写一个Dockerfile(文件名字必须是Dockerfile),拉取的项目已经有了
vim dockerfile
FROM python:python39
MAINTAINER hkw
EXPOSE 8080
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt -i https://pypi.douban.com/simple/
RUN pip install uwsgi -i https://pypi.douban.com/simple/
COPY . /tmp/
VOLUME ["/home"]
WORKDIR /home/luffyapi
CMD ["python", "/home/luffyapi/manage_pro.py", "runserver", "0.0.0.0:8080"] FROM python:python39
MAINTAINER hkw
EXPOSE 8080
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt -i https://pypi.douban.com/simple/
COPY . /tmp/
VOLUME ["/tmp"]
WORKDIR /tmp
CMD ["uwsgi", "--ini", "/tmp/uwsgi.ini"]
CMD ["python", "/tmp/manage_pro.py", "runserver", "0.0.0.0:8080"]
# pip install 安装的时候可能会出现
"""
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f3b57815c70>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /simple/authlib/
#0 129.1 ERROR: Could not find a version that satisfies the requirement Authlib==1.2.0 (from versions: none)
#0 129.1 ERROR: No matching distribution found for Authlib
"""
# 解决方法:vim /etc/resolv.conf 增加:nameserver 8.8.8.8
# 4.通过dockerfile构建出镜像(不要省略后面的点)
docker build -t='luffyv1' .
# 5.查看镜像
docker images
# 6.启动容器
docker run -di --name=luffyv1 -v /home/luffyapi/:/home/luffyapi/ -p 8080:8080 -e MYSQL_PASSWORD=root123456 -e REDIS_PASSWORD=root123456 -e TX_SMS_KEY=cb1e82df4095c4695988b38cc2745591 luffyv1
# 如果git上更新了代码,服务器git pull一下,重启一下容器,就是最新的代码了
# 进入容器
docker exec -ti luffyv1 /bin/bash
# 7.在外部访问测试
# 8.配置nginx转发
# 9.创建文件夹
mkdir -p /opt/nginx/conf /opt/nginx/html /opt/nginx/logs
# 10.新建配置文件
vim /opt/nginx/conf/nginx.conf
# 11.写入(配置了负载均衡)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream node {
server 10.0.0.10:8080;
server 10.0.0.10:8081;
}
server {
listen 80;
server_name localhost;
location / {
# proxy_pass http://10.0.0.10:8080;
# 负载均衡配置
proxy_pass http://node;
}
}
}
# 12.docker中运行nginx
docker run --name lnginx -id -p 80:80 -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/html:/etc/nginx/html -v /opt/nginx/logs:/var/log/nginx nginx:nginx1.23.3
# 13.多启动几个docker容器
docker run -di --name=luffyv1_2 -v /home/luffyapi/:/home/luffyapi/ -p 8081:8080 -e MYSQL_PASSWORD=root123456 -e REDIS_PASSWORD=root123456 -e TX_SMS_KEY=cb1e82df4095c4695988b38cc2745591 luffyv1
# 14.重启nginx
# 假设一个容器挂了,其他的容器启动着,也能正常提供服务

dockerhub私有仓库

https://hub.docker.com/

登录上传

# 把自己的镜像传到docker hub上
# 1.登录
docker login 回车,输入用户名 密码
# 2.给你要上传的image打个标签
docker tag 38f3 用户名/luffyv1
# 3.上传
docker push 镜像

下载

# 0.拉取私有仓库镜像
docker pull registry
# 0.启动容器
docker run -di --name=registry -p 5000:5000 registry
# 打开浏览器 输入地址http://10.0.0.10:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
# 1.配置
修改daemon.json
vim /etc/docker/daemon.json
添加以下内容,用于让docker信任私有仓库地址
{"insecure-registries":["10.0.0.10:5000"]}
# 2.重启docker服务
systemctl restart docker
# 3.重启容器
docker start registry
# 4.打标签
docker tag 38f3 10.0.0.10:5000/luffyv1
# 5.上传到私有仓库
docker push 10.0.0.10:5000/luffyv1
# 访问 http://10.0.0.10:5000/v2/_catalog
# 6.从私有仓库拉取镜像
docker pull 10.0.0.10:5000/luffyv1

docker-compose

介绍

docker-compose是一个单机情况下容器编排的工具

通过yml文件定义多个容器,默认名字docker-compose.yml

三个概念,Service Networks ,Volumes,一个service代表一个container,这个container可以从docker hub的image来创建,或者从本地dockerfile build的image来创建

安装

# github有点慢,可以使用daocloud
https://get.daocloud.io/
# 1.安装
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.16.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 2.权限设置
chmod +x /usr/local/bin/docker-compose
# 3.查看版本信息
docker-compose -v

部署多应用

# 0.写一个dockerfile和一个docker-compose文件(上面的项目里面已经有了(项目代码里的是数据库用的是sqlite3)https://github.com/HkwJsxl/LuffyAPI)
# 0.拉取镜像(上面的 镜像操作 里面有步骤),暂停所有容器,删除所有容器
# 1.启动
docker-compose up
# 后台启动
docker-compose up -d

常用命令

ps  # 查看已经启动的服务状态
up # 启动yml定义的所有服务
stop # 停止yml中定义的所有服务
start # 启动被停止的yml中的所有服务
kill # 停止某个服务
logs # 可以查看某个服务的log
port # 打印绑定的public port
pull # pull服务镜像
kill # 强行停止yml中定义的所有服务
rm # 删除yml中定义的所有服务
restart # 重启yml中定义的所有服务
scale # 扩展某个服务的个数,可以向上或向下

多个容器直接通信方式

1 端口映射到宿主机,直接访问宿主机
2 通过ip地址访问
3 run的时候指定 --link 容器
docker run -di --name=centos1 centos:centos7
docker run -di --name=centos2 --link centos1 centos:centos7 进入到centos2中 ping centos1 可以ping同
# 跨主机的容器通信
-端口映射

Volume相关

docker使用volume实现数据的持久化,不仅如此volume还能帮助容器和容器之间,容器和主机之间共享数据。

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立马生效
  • 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

基本语句

# 创建一个数据卷
docker volume create my-vol
# 查看所有的数据卷
docker volume ls
# 查看指定数据卷的信息
docker inspect id
# 启动一个挂载数据卷的容器
在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷。
--mount source=/home/nginx,target=/usr/share/nginx/html
# 删除数据卷
docker volume rm id/名字
# 清理无主的数据卷
docker volume prune
# 如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

使用

# 基于本地的Volume:在容器创建或者run的时候,通过 -v指定
# 基于plugin的Volume:插件方式,第三方方案,如NAS,aws
# volume的类型
# 1 受管理的data Volume,由docker后台自动创建(Data volume)
# 2 绑定挂载的Volume,具体挂载可以由用户指定 (Bind Mouting)
#################Data volume
## 启动一个mysql的容器
docker run -d --name lmysql -e MYSQL_ROOT_PASSWORD=root123456 mysql:mysql8.0.32
docker volume ls # 可以看到刚刚创建容器的voluem
docker volume id号 # 删除
docker inspect id号 # 可以看到mount到的本地某个位置
# 再创建,也会创建一个volume
# 删除容器,volume是不会被删除的(数据不会丢) # 两个容器可以共用一个volume
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ROOT_PASSWORD=root123456 mysql:mysql8.0.32
# 进入到容器,创建一个数据库
# 停掉容器,删除容器
sudo docker volume ls # 文件还在(删除掉容器,下次用同样的方式启动这个容器文件啥的都还在)
# 重启一个容器,使用该volume
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ROOT_PASSWORD=root123456 mysql:mysql8.0.32
# 进入到容器,看到数据库还在

清除docker镜像缓存

# 命令
docker system prune --volumes

作用:所有停止的容器;所有不被任何一个容器使用的网络;所有不被任何一个容器使用的volume;所有无实例的镜像

docker开发的更多相关文章

  1. Visual Studio Code和Docker开发asp.net core和mysql应用

    Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ...

  2. Mac结合Docker开发

    Mac结合Docker开发 前几天在看Java并发实战时,在Mac上写了一个示例,结果运行后无法按照书本上运行.主要是有些命令,在Mac和Linux是有区别的,比如top, Mac上是不支持-Hp,意 ...

  3. Springboot整合MongoDB的Docker开发,其它应用也类似

    1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...

  4. docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用

    .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ...

  5. vagrant特性——基于docker开发环境(docker和vagrant的结合)-1-基本使用

    Docker vagrant提供了使用Docker作为provider(其他的provider有virtualBox.VMware\hyper-V等)的开箱即用支持.这允许你的开发环境由Docker容 ...

  6. vagrant特性——基于docker开发环境(docker和vagrant的结合)-0-简介

    原文https://www.hashicorp.com/blog/feature-preview-docker-based-development-environments Feature Previ ...

  7. vagrant特性——基于docker开发环境(docker和vagrant的结合)-3-boxes和配置

    Docker Boxes Docker provider不需要vagrant box.因此其config.vm.box设置是完全可选的.但是,仍然可以使用并指定一个box来提供默认值.由于一个带着bo ...

  8. 使用Docker开发NodeJs APP

    英文版原文地址 这是两篇连载文章的第一篇,讲解了如何使用 Docker 替代 Vagrant 开发基于 Express 框架的NodeJs App的部分细节.不过,这次要增加点难度:我们要使用 con ...

  9. .net core 在 Docker 开发下的巨坑

    一,Docker 的安装 Windows 安装  Docker 官方文档: https://docs.microsoft.com/zh-cn/virtualization/windowscontain ...

  10. 使用 Docker 开发 - 使用多阶段构建镜像

    多阶段构建是一个新特性,需要 Docker 17.05 或更高版本的守护进程和客户端.对于那些努力优化 Dockerfiles 并使其易于阅读和维护的人来说,多阶段构建非常有用. 在多阶段构建之前 构 ...

随机推荐

  1. 【转帖】eBay 云计算“网”事|网络重传篇

    https://www.infoq.cn/article/iy1drmf6wk8up14dchq8/ #导读 在之前的eBay云计算"网"事|网络超时篇和eBay云计算" ...

  2. [转帖]03-rsync传输模式(本地传输、远程方式传输、守护进程模式传输)

    https://developer.aliyun.com/article/885801?spm=a2c6h.24874632.expert-profile.282.7c46cfe9h5DxWK 简介: ...

  3. [转帖]【JVM】Java内存区域与OOM

    引入 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. Java虚拟机运行时数据区 如图所示 1.程序计数器(线程私有 ...

  4. Rsync的简单使用

    Rsync的简单使用 需求 一个运行很久的系统里面可能包含了非常多的垃圾文件. 但是又不可能随便删除, 很多垃圾可能有某些奇葩的用法. 有时候新建一个应用复制文件的话比较浪费磁盘和带宽. 所以这里简单 ...

  5. echarts使用transform缩放后导致图标模糊

    echarts使用transform缩放后导致图标模糊 --的解决办法 当使用了transform: scale(x,y)缩放后致使echarts图表模糊.怎么解决这个问题呢? 第一种解决办法:将ca ...

  6. echarts的初始化和销毁dispose

    容器节点被销毁以及被重建时 假设页面中存在多个标签页, 每个标签页都包含一些图表. 当选中一个标签页的时候,其他标签页的内容在 DOM 中被移除了. 这样,当用户再选中这些标签页的时候,就会发现图表& ...

  7. 将地址栏的参数变成json序列化。

    将地址栏的参数变成json序列化. GetQueryJson1 () { let url = this.$route.query.redirect; // 获取当前浏览器的URL (redirect= ...

  8. 【解决了一个小问题】es query返回数据中, int64类型精度丢失的问题

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 首先定义了一个简单的结构体来接收es query返回的数据 ...

  9. Gin 框架介绍与快速入门

    Gin 框架介绍与快速入门 目录 Gin 框架介绍与快速入门 一.Gin框架介绍 1. 快速和轻量级 2. 路由和中间件 3. JSON解析 4. 支持插件 5. Gin相关文档 二.基本使用 1.安 ...

  10. github clone或访问慢

    做技术的我们经常会访问github.com,有时出现github访问非常慢或者git clone速度很慢,git push也很慢 原因很简单:github被高高的墙屏蔽了. 所以解决方案就是手动把 c ...