容器自动化(一):docker基础(上)
一,Docker简介,功能特性与应用场景
1.1 Docker简介
- Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
- 一个完整的Docker有以下几个部分组成:
- Docker Client 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- Docker Container 容器
1.2 Docker功能特性
- 隔离环境(系统,网络,文件系统)与应用
- 解决依赖与版本问题
- 易于分发,开箱即用
- 节点与容器快速扩容
- 镜像制作简单便捷,管理方便
(1)隔离
- 通过cgroup(隔离和跟踪资源的使用)& namespace(组与组之间隔离)来实现轻量级的进程隔离
- 对于容器中运行的进程来说,自己独占了一个系统
- 容器间网络,文件及其他资源都互相隔离
(2)版本与依赖
- 传统模式下,多个不同环境或版本的项目需要部署在不同机器上,部署与后期维护管理复杂繁琐。
- 使用Docker,通过多个不同版本或者环境的镜像,可以同时运行在一台机器上互不干扰,部署与后期维护简单方便。
(3)分发与使用
- 镜像可以通过导入,导出,上传到镜像仓库等多种方式进行分发
- 在启动了Docker的系统上直接使用docker run即可启动镜像,无需特别配置。
(4)扩容
- 容器扩容简单方便
- 扩容节点只需安装并启动Docker即可
(5)镜像制作
- 镜像的灵魂Dockerfile
- 使用Dockerfile进行指令控制
- 基于Linux命令,易于理解,快速上手
- 易于定制与修改
1.3 Docker应用场景
- Docker通常应用于如下场景:
- web应用的自动化打包和发布;
- 自动化测试和持续集成,发布;
- 应用服务,如MySQL,Redis等,通过Docker实现快速部署;
- k8s私有云
1.3.1 场景1:多版本多种类系统与软件
1.3.2 场景2: 环境
1.3.3 场景3: 分发
二,Docker的安装
2.1 安装环境
最小化安装Centos7.5,关闭防火墙和selinux
2.2 版本选择
- Docker
- 17.03之后版本变为Docker CE
- Docker CE
- 社区版,Community Edition
- Docker EE
- 企业版,Enterprise Edition
- 收费版本,强调安全性,提供一些高级特性及商业支持
2.3 Docker安装:标准版本
[root@Docker ~]# yum -y install docker
2.4 Docker安装:CE社区版
首先清理掉yum安装的docker标准版
这里有两种方式
第一种清理docker方法
:
[root@Docker ~]# yum -y remove docker
第一种清理docker方法
:
[root@Docker ~]# yum history list #查看yum安装的历史列表
[root@Docker ~]# yum history info 16 #查看yum历史安装ID为6的安装信息
[root@Docker ~]# yum -y history undo 16 #进行yum安装操作回退
安装Docker的CE社区版
安装依赖包
[root@Docker ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
添加docker的CE版本的yum源配置文件
[root@Docker ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
安装CE版本的docker
[root@Docker ~]# yum -y install docker-ce
启动docker,
添加开机启动,
查看docker版本
[root@Wangwenli ~]# systemctl start docker
[root@Wangwenli ~]# systemctl enable docker
[root@Wangwenli ~]# docker version
三,Docker的操作命令
3.0 添加docker国内镜像源
在开始学习docker之前,我们首先要更改一下docker的默认源镜像下载地址(默认是从国外下载,很慢),我们需要添加国内的源地址
[root@Wangwenli ~]# cat /etc/docker/daemon.json
{
"registry-mirrors":[ "https://registry.docker-cn.com" ]
}
[root@Wangwenli ~]# systemctl daemon-reload
[root@Wangwenli ~]# systemctl restart docker
3.1 Docker命令:search(用于从docker的官方公有镜像仓库查找镜像)
[root@Wangwenli ~]# docker search centos
特别说明:
Name:镜像的名字
DESCRIPTION:描述
STARS:星级(越高越好)
OFFICIAL:是否是官方发布的
AUTOMATED:是否自动化的
(2)查找星级多于100的centos镜像
[root@Wangwenli ~]# docker search centos -f stars=100
特别提示:
/:符号用于分割作者名称和镜像名称
ansible/centos7-ansible:ansible是作者名称,centos7-ansible是镜像名称
(3)多条件查找--filter
查找官方发布的,星级大于100的centos镜像
[root@Wangwenli ~]# docker search centos --filter is-official=true --filter stars=100
3.2 Docker命令:pull(用于从Docker Hub上下载公有镜像)
查找符合条件的hello-world镜像
[root@Wangwenli ~]# docker search hello-world --filter is-official=true --filter stars=100
下载目标hello-world镜像
[root@Wangwenli ~]# docker pull hello-world
下载目标centos:7镜像(
网速不好的话,需要点时间耐心等待
)
[root@Wangwenli ~]# docker pull centos:7
3.3 Docker命令:images
用于本地镜像的查看
特别说明:
REPOSITORY:镜像仓库(下边罗列的都是本地已有镜像名称)
TAG:镜像的标记(为了区分同名镜像)
IMAGES ID:镜像的ID号
CREATED:此镜像的创建时间
SIZE:此镜像的大小
3.4 Docker命令:build
用于本地自定义镜像的构建,需要创建Dockerfile文件
创建Dockerfile文件的存储目录
[root@Docker ~]# mkdir -p /root/dockerfile/lib/centos/7
[root@Docker ~]# cd /root/dockerfile/lib/centos/7
创建docker.sh脚本
[root@Docker 7]# vim docker.sh
[root@Docker 7]# cat docker.sh
#!/bin/bash
while true
do
echo "nihao"
sleep 5
done
创建Dockerfile配置文件,文件名称必须为Dockerfile,第一个字母必须大写
[root@Docker 7]# vim Dockerfile
[root@Docker 7]# cat Dockerfile
FROM centos #从centos源镜像的基础上进行构建
LABEL MAINTATNER="wwl" #作者的名称
RUN ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #RUN:在镜像构建过程中运行命令
ADD docker.sh /home/test/ #从本地系统中把docker.sh文件添加到构建中的镜像的/home/test/目录下
RUN chmod +x /home/test/docker.sh #在镜像构建过程中运行命令
CMD ["/home/test/docker.sh"] #构建镜像完成时,最后执行的命令
根据Dockfile配置文件构建一个自定义镜像
[root@Docker 7]# docker build -t wwl/centos7:1 . #-t 指定镜像名称 :1 设定镜像的tag标记
3.5 Docker命令:run
运行一个本地镜像
[root@Docker 7]# docker run -dit 930caa8ceeb6 /bin/bash
1af173b11dbb11131a823f9ef64979cf2db906bb2d442d00447cc8161971cc66
特别提示:
docker run:运行一个指定的images id
-d:放在后台运行
-i:可以进行命令交互
-t:制作一个伪终端用于登陆
- 930caa8ceeb6:
镜像的ID,可以简写成930
3.6 Docker命令:ps
查看已经运行的镜像的进程
[root@Docker 7]# docker ps -a #查看所有运行的镜像进程(包含退出的exit)
特别提示:
STATUS:进程的状态,UP表示正在运行中,EXIT表示已经退出了。
3.7 Docker命令:attach
从本地系统中切入到某个STATUS状态是UP的镜像进程里
[root@Docker 7]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES1af173b11dbb 930caa8ceeb6 "/bin/bash" 4 minutes ago Up 4 minutes
upbeat_napier[root@Docker 7]# docker attach 1af173b11dbb #切入到容器号为1af173b11dbb的镜像进程里
[root@1af173b11dbb /]# ls #已经进入容器里了
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@1af173b11dbb /]# exit #退出容器
exit
[root@Docker 7]# docker ps -a #容器的进程的STATUS已经处于EXIT状态(之前是后台运行的,切入进去后执行exit就等于手动退出了)
3.8 Docker命令:stop
用于停止一个正在运行着的容器进程
再次在后台启动一个镜像
增加了一个容器进程
停止一个运行着的容器进程
3.9 Docker命令:start
用于启动一个已经停止了的容器进程
3.10 Docker命令:rm
用于删除一个已经停止了的容器进程
3.11 Docker命令:rmi
用于删除一个未用作容器启动的本地镜像
[root@Docker 7]# docker rmi 930
Error response from daemon: conflict: unable to delete 930caa8ceeb6 (cannot be forced) - image is being used by running container 8576060bb73d #但要注意,被用作容器启动的镜像是不能删除的(需先rm删除容器进程)
[root@Docker 7]# docker rmi -f 930
Error response from daemon: conflict: unable to delete 930caa8ceeb6 (cannot be forced) - image is being used by running container 8576060bb73d #强行删除被容器进程占用的镜像也是不行的
查看容器进程,被占用中
3.12 Docker命令:commit
将一个更改过的容器进程的容器状态保存为一个新的镜像
查看启动的容器进程
切入容器进程,
在容器进程里创建yunjisuan目录,
退出容器进程
将更改后的容器进程保存为一个新的镜像
[root@Docker 7]# docker commit 857 wwl/centos:2
sha256:e11d502b90bc022ae5d8ed6b068e25e45f50a89edf6d9dfaf6caa7ede44c4acb
启动新保存的镜像
[root@Docker 7]# docker run -dit e11 /bin/bash
0ffd2ef0e3bdaa36f02cc4f59ea0e19c2355878dbe820e9053e7d4a8aafda7bd
查看新镜像的容器进程
切入新镜像的容器进程,
我们发现之前创建的目录仍旧存在
3.13 Docker命令:exec
用于从本地操作系统上直接向容器进程发布执行命令并返回结果
[root@Docker ~]# docker exec 0ff ls /tmp #查看容器进程里的/tmp目录下所有内容
ks-script-h2MyUP
yum.log
[root@Docker ~]# docker exec 0ff ls -d yunjisuan #查看容器进程里/yunjisuan目录
yunjisuan
3.14 Docker命令:cp
用于在容器进程和本地系统之间复制文件
[root@Docker ~]# docker exec 0ff ls /tmp #向容器进程发布命令
ks-script-h2MyUP
yum.log
[root@Docker ~]# docker cp 0ff:/tmp/yum.log . #将指定容器进程的/tmp/yum.log复制到当
前目录下
[root@Docker ~]# ls
anaconda-ks.cfg dockerfile yum.log #已经复制过来了
[root@Docker ~]# docker cp anaconda-ks.cfg 0ff:/tmp/ #将本地文件复制到容器进程里
[root@Docker ~]# docker exec 0ff ls /tmp
anaconda-ks.cfg #复制成功
ks-script-h2MyUP
yum.log
3.15 Docker命令:create
用于创建一个容器进程,但是并不启动它
3.16 Docker命令:diff
查看容器进程与源镜像做对比,发生了改变的文件或文件夹
启动一个镜像的容器进程
[root@Docker ~]# docker run -dit e11
d1e90a6a0013e735c4fca03f1325e9a966fd356bec8d33bc534c1c73e7d90b30
切入容器进程
,在容器进程中创建文件
,退出容器进程
查看容器进程的变化
3.17 Docker命令:events
时时监测容器的变化情况
前台时时监控容器的变化若要检测,需要另外再起一个窗口进行操作
3.18 Docker命令:export
将容器进程的文件系统导出到本地
将容器进程导出成一个tar包
3.19 Docker命令:import
用于将export导出的文件系统创建为一个镜像
3.20 Docker命令:history
用于查看一个镜像的历史修改纪录
3.21 Docker命令:info
用于查看当前操作系统的docker运行信息
[root@Docker ~]# docker info
Containers: 1 #容器进程1个
Running: 1 #正在运行状态的容器1个
Paused: 0
Stopped: 0
Images: 8 #一共有8个镜像
Server Version: 18.09.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 96ec2177ae841256168fcf76954f7177af9446eb
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 974.6MiB
Name: Docker
ID: 5YNS:BXNE:O23E:DZWE:ST6K:OEXH:LBAB:DCAD:5W3D:RUJU:FQ64:3O5O
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://registry.docker-cn.com/
Live Restore Enabled: false
Product License: Community Engine
3.22 Docker命令:inspect
查看某个镜像的详细信息
[root@Docker ~]# docker inspect ea32ac5ede08
[
{
"Id": "sha256:ea32ac5ede089e65676f3e00b7580be456234206999e75c767debd0071c7d7a7",
"RepoTags": [
"wwl/centos:3"
],
"RepoDigests": [],
"Parent": "",
"Comment": "Imported from -",
"Created": "2019-01-14T07:43:56.554044061Z",
"Container": "",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"DockerVersion": "18.09.1",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 201779577,
"VirtualSize": 201779577,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/3da3b10942aa4ef821dbe590d8c1b968ca72c06430618ffd317f
a0920ca860bd/merged", "UpperDir": "/var/lib/docker/overlay2/3da3b10942aa4ef821dbe590d8c1b968ca72c06430618ffd317fa
0920ca860bd/diff", "WorkDir": "/var/lib/docker/overlay2/3da3b10942aa4ef821dbe590d8c1b968ca72c06430618ffd317fa0
920ca860bd/work" },
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:f92b22b571a9faebf9f5e013f8f7d84c0181c0610fdb8b20fc2da22f43b0b56d"
]
},
"Metadata": {
"LastTagTime": "2019-01-14T15:43:56.603952511+08:00"
}
}
]
3.23 Docker命令:kill
强行停止一个或多个正在运行状态的容器进程
3.24 Docker命令:save
用于将一个镜像的文件系统导出到本地(export导出的是容器)
重新build一个镜像
save导出test:1这个镜像(也可以用id号)
3.25 Docker命令:load
用于将save导出到本地的tar包,重新加载为镜像(和源镜像的名字标识完全一样)
删除别的镜像,就保留两个
将之前test:1这个镜像的save备份导入系统
3.26 Docker命令:logs
用于输出一个容器进程内的操作日志
只显示容器日志的后5行
3.27 Docker命令:pause && unpause
用于将一个或多个容器的进程暂停和恢复
3.28 Docker命令:port
用于列出一个容器的端口映射及协议
[root@Docker 7]# docker run -dit -p 6666:22 test:1 #启动一个镜像的容器进程 -p 指定本地6666端口映射到容器的22端口
d7641bcd7949432b0eaa084bd7600cf2631add788ecb2ec6f124ffa2532a5bd0
[root@Docker 7]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PO
RTS NAMESd7641bcd7949 test:1 "/home/test/docker.sh" 5 seconds ago Up 3 seconds 0.
0.0.0:6666->22/tcp romantic_gates2d5d764e0e22 test:1 "/home/test/docker.sh" 4 minutes ago Up 4 minutes
silly_jackson
查看容器进程的端口映射及协议
[root@Docker 7]# docker port d7641bcd7949
22/tcp -> 0.0.0.0:6666
[root@Docker 7]# docker pull nginx
[root@Docker 7]# docker run -dit --name nginx_test -p 80:80 7042885a156a 启动本地镜像nginx,进程名叫nginx_test,将本地的80端口映射到容器的80端口
nginx关闭了守护模式,就相当于nginx在前台启动了,平常启动nginx是在后台启动,但是放后台启动容器启动不了,所以在启动时关闭了nginx的守护模式
本地没有安装nginx,看的就是容器里的nginx,就是访问宿主机的80端口,映射到了容器里的80端口
3.29 Docker命令:rename
给容器进程重命名
3.30 Docker命令:restart
重启一个容器进程
3.31 Docker命令:stats
用于时时输出容器的资源使用情况
--no-tream只输出一次
3.32 Docker命令:tag
用于从一个指定的镜像创建另外一个镜像
3.33 Docker命令:top
用于显示指定容器的进程信息
3.34 Docker命令:update
用于调整一个或多个容器的启动配置
3.35 Docker命令:version and wait
version用于显示docker的版本信息
wait用于捕捉一个或多个容器的退出状态,并返回退出状态码
显示docker版本信息
监听容器的退出状态并返回状态码
[root@Docker 7]# docker wait wwl
需要在开一个窗口stop这个容器进程再查看
3.36 Docker命令:login && logout && push
- login用于登陆docker hub官方公有仓库
- logout用于登出docker hub官方公有仓库
- push用于将本地镜像提交到docker hub
由于docker hub国内已经无法注册,因此无法演示上述内容
DockerHub官方公有镜像仓库:https://hub.docker.com/
四,管理应用程序数据
4.1 Volume和Bind Mount
将Docker主机数据挂载到容器
- Docker提供三种不同方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs。
- volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
- bind mounts:可以存储在宿主机系统的任意位置
- tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统
4.1.1 Volume
创建一个卷
下载一个nginx官方镜像(前面已经下载过)
[root@Docker 7]# docker run -dit --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/
html nginx
特别说明:
--name:容器的名字
--mount:挂载
src:源卷的名字
dst:挂载到容器中的路径
向容器中的挂载目录创建文件,查看是否挂载成功
[root@Docker 7]# docker exec nginx-test touch /usr/share/nginx/html/test.txt
[root@Docker 7]# docker exec nginx-test ls /usr/share/nginx/html/
50x.html
index.html
test.txt #有了
[root@Docker 7]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html test.txt #成功
清理容器进程
清理容器后,挂载的卷的数据仍旧存在
重新启动镜像nginx的容器进程
特别提示:
docker run的-p参数:指定端口的映射,88:80的意思就是将宿主机88端口的访问映射到容器进程的80端口
现在我们通过浏览器访问宿主机的88端口,进而访问容器进程的80端口
在数据卷nginx-vol里换一个网页在访问
现在我们再启动一个镜像nginx的进程,让两个nginx的容器进程公用一个数据卷nginx-vol
[root@Docker 7]# docker run -dit --name nginx-test2 -p 89:80 --mount src=nginx-vol,dst=/usr/sh
are/nginx/html nginx
我们用浏览器访问docker宿主机的89端口
4.1.2 Bind Mounts
[root@Docker 7]# docker run -dit --name nginx-test3 -p 90:80 --mount type=bind,src=/var/lib/do
cker/volumes/nginx-vol/_data,dst=/usr/share/nginx/html nginx
我们用浏览器访问docker宿主机的90端口
特别提示:
bind mounts可以挂载宿主机上的任意目录,而volume先得创建后才能挂载
用卷管理,卷创建好是空的,然后挂载到镜像里,镜像里的源目录是有东西的,它会自动出现在卷里,但是bind mounts会把镜像里的东西给顶了,以这种方式挂过去,默认是以自己目录为主,如果用卷,是以对方目录为主
4.2 实战容器部署LNMP网站平台
首先我们下载一个wordpress博客
wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
4.2.1 创建MySQL数据库容器
下载MySQL5.6版本镜像:[root@Docker ~]# docker pull mysql:5.6
[root@Docker ~]# docker network create lnmp #创建一个自定义网络
启动MySQL数据库容器
[root@Docker ~]# docker run -dit --name lnmp_mysql --network lnmp -p 3306:3306 --mount src=mys
ql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 mysql:5.6 --character-set-server=utf8
索引的长度不能超过254=254x3字节(一个汉字三字节),索引太长容易影响sql的效率
特别提示:
- 自定义网络lnmp如果不提前创建的话,在启动容器进程时会报错
- 如果没有提前pull好mysql:5.6那么容器在启动时会自动下载对应镜像
- 如果没有提前docker volume create mysql-vol,那么容器启动时会自动创建
4.2.2 向容器里的Mysql创建一个库
[root@Docker ~]# docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
4.2.3 查看添加的库
4.2.4 创建nginx+PHP环境容器
nginx和PHP都需要访问网页目录,并且nginx和php的网页路径必须一样,nginx和tomcat配合就不是,tomcat自己可以独立访问动静态,只是tomcat处理静态很差,太慢,前面才加了nginx,然后nginx推给8080端口就到了tomcat
创建一个网页目录
下载richarvey/nginx-php-fpm镜像
[root@Docker ~]# docker pull richarvey/nginx-php-fpm
启动richarvey/nginx-php-fpm镜像的容器
[root@Docker ~]# docker run -dit --name lnmp_web --network lnmp -p 88:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
4.2.5 解压wordpress到网页目录/app/wwwroot下
建一个静态首页
4.2.6 博客wordpress访问测试
如果还访问不了,那么执行下面的,重启docker
通过浏览器进行docker宿主机的88端口的访问测试
http://IP:88/访问成功后再去访问
特别提示:
如果多次连续访问同一网页,那么浏览器有可能默认去掉指定的端口
因此,若访问不到,请查看是否指定了88端口
容器自动化(一):docker基础(上)的更多相关文章
- 容器技术之Docker基础入门
前文我们了解了下LXC的基础用法以及图形管理工具LXC WEB Panel的简单使用,有兴趣的朋友可以参考https://www.cnblogs.com/qiuhom-1874/p/12904188. ...
- 容器101:Docker基础
Docker如此受欢迎的一个原因是它提供了“一次开发,随处运行”的承诺.Docker提供了一种将应用程序及其运行时依赖性打包到单个容器中的简单方法.它还提供了一个运行时抽象,使容器能够跨不同版本的Li ...
- Docker基础修炼1--Docker简介及快速入门体验
本文作为Docker基础系列第一篇文章,将详细阐述和分析三个问题:Docker是什么?为什么要用Docker?如何快速掌握Docker技术? 本系列文章中Docker的用法演示是基于CentOS7进行 ...
- 2.docker基础用法
一.前言 OCI(Open Container Initiative):由Linux基金会主导于2015年6月创立,OCI定义了容器运行时的标准. OCI有两部分组成: the Runtime Spe ...
- Docker 容器安装及常用基础命令
为什么用docker 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. Docker 在如下几个方面具有较大的优势: 更快速的交付和部署 Docker在整个开发周期都可以 ...
- Docker基础(上)
Docker基础(上) 链接:https://pan.baidu.com/s/1KQjKml2OZAReYwOvpWD9XQ 提取码:6vo8 复制这段内容后打开百度网盘手机App,操作更方便哦 1. ...
- 【转帖】使用容器化和 Docker 实现 DevOps 的基础知识
使用容器化和 Docker 实现 DevOps 的基础知识 https://www.kubernetes.org.cn/6730.html 2020-02-24 15:20 灵雀云 分类:容器 阅读( ...
- Docker基础技术:Linux Namespace(上)
时下最热的技术莫过于Docker了,很多人都觉得Docker是个新技术,其实不然,Docker除了其编程语言用go比较新外,其实它还真不是个新东西,也就是个新瓶装旧酒的东西,所谓的The New “O ...
- 史上最全docker基础知识汇总
正文 Docker常用命令 run docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -e设置环境变量:-e username=zhj --name为容器指定 ...
随机推荐
- Eclipse JEE 2018.12R TUNA源直接下载地址
下载地址:https://mirrors.tuna.tsinghua.edu.cn/eclipse/technology/epp/downloads/release/2018-12/R/eclipse ...
- 【Leetcode_easy】836. Rectangle Overlap
problem 836. Rectangle Overlap solution: class Solution { public: bool isRectangleOverlap(vector< ...
- CSS3 《3D骰子 压大小》
游戏在线预览地址:http://dtdxrk.github.io/game/3d-dice/index.html js判断一个随机数大小的游戏. 本来想用canvas做的,平面的生产一个点数,感觉没啥 ...
- Okhttp3基本使用
https://square.github.io/okhttp/ https://www.jianshu.com/p/da4a806e599b https://www.cnblogs.com/wzk- ...
- 利用eclipse导入jar包到本地仓库
如果不也不想用mvn install xxxxxx 后面跟一大堆的东东,可以让eclipse替代完成导入,看下图 File------->Import 大功告成,可见eclipse还没有废掉,至 ...
- WPF ComboBox(转)
WPF ComboBox 创建一个ComboBox控件,并设置ComboBox控件的名称,高度,宽度.及设置ComboBox的垂直和水平对齐. <ComboBox Name="Comb ...
- eNSP基于接口地址池的dhcp服务
拓扑图如下 基于接口的dhcp是最简单的一种 我们对路由器的两个端口分别设置ip地址为192.168.1.254 192.168.2.254 然后分别进入接口进行下一步配置 dhcp select i ...
- Java创建线程的两种方法
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...
- 洛谷 题解 P1550 【[USACO08OCT]打井Watering Hole】
本题看似很难,实际上思路非常简单--如果你想通了. 首先有一个问题:图中有几个点?大部分的人会回答\(n\)个点.错了,有\(n+1\)个. 多出来的那个点在哪?关键在于你要理解每一个决策的意义.实际 ...
- lombok的@Accessors注解
@AllArgsConstructor @Data @NoArgsConstructor @Accessors(chain = true) @EqualsAndHashCode public clas ...