01docker简单使用和配置(容器、镜像)
一:容器中运行简单应用程序
1:hello world
使用docker可以在容器中运行应用程序,使用docker run命令即可。比如下面的命令:
$ docker run ubuntu /bin/echo 'Hello world'
Hello world
docker run命令用于运行一个新的容器,ubuntu指定了该容器运行基于的镜像是Ubuntu操作系统镜像。指定镜像后,Docker首先在Docker主机本地寻找镜像,如果找不到则去公共镜像仓库:Docker Hub下载。
接下来,就是指定要在新容器中运行的命令:/bin/echo 'Hello world'。
运行该容器时,Docker创建一个新的Ubuntu操作系统环境,并且在其中执行/bin/echo命令,然后将命令结果输出到终端。
这种情况下,容器只有在运行命令时处于running状态,一旦命令执行完成,输出” Hello world”之后,该容器也就停止运行了。
2:交互式的容器
运行以下命令:
$ docker run -t -i ubuntu /bin/bash
root@af8bae53bdd3:/#
还是以ubunt为基础镜像,这次运行的命令是/bin/bash,在容器中加载一个BASH shell。docker命令中多了两个选项:-t和-i,-t用于在容器中分配一个新的终端,-i使得用户可以与容器进行交互。
因此,容器加载后,就可以在容器中执行其他命令了:
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@af8bae53bdd3:/# exit
可见,在容器中,当前处于根目录下,并且根目录的结构就是典型的Linux文件系统。
运行exit退出当前shell,Bash shell进程也就停止了,因此容器也就停止运行了。
3:后台运行容器
使用以下命令,可以在后台运行容器:
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
这里使用-d选项,将容器置于后台运行,使其成为daemon进程。
这里在容器中运行的程序是一个在/bin/sh中,每隔1s打印一次hello world的程序。
运行该命令后,返回的是一个容器ID,利用该容器ID,可以使用docker ps命令,查看当前处于运行状态的容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
可见,刚刚运行的容器处于UP状态,该命令还列出了刚刚容器的名字:insane_babbage,可以根据该名字,使用docker logs命令可以得到容器的标准输出。查看容器中的命令输出:
$ docker logs insane_babbage
hello world
hello world
hello world
. . .
使用docker stop命令,可以停止该容器:
$ docker stop insane_babbage
insane_babbage
再次使用docker ps命令查看,发现已经没有容器运行了:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
二:容器中运行实际应用
1:docker客户端
每次在shell中使用docker命令,实际上是启动了一个docker客户端,docker客户端连接docker服务器,由服务器执行相应的命令。可以使用docker version命令,查看当前主机上安装的docker客户单和docker服务器版本:
[hh_93_197 /]# docker version
Client:
Version: 1.10.3
API version: 1.22
Go version: go1.5.3
Git commit: 20f81dd
Built: Thu Mar 10 15:39:25 2016
OS/Arch: linux/amd64 Server:
Version: 1.10.3
API version: 1.22
Go version: go1.5.3
Git commit: 20f81dd
Built: Thu Mar 10 15:39:25 2016
OS/Arch: linux/amd64
2:查看docker命令帮助信息
可以使用命令docker --help,查看docker帮助信息,也可以使用--help,查看docker子命令的帮助信息,比如:
[hh_93_197 /]# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -a, --attach=[] Attach to STDIN, STDOUT or STDERR
--add-host=[] Add a custom host-to-IP mapping (host:ip)
--blkio-weight Block IO (relative weight), between 10 and 1000
--blkio-weight-device=[] Block IO weight (relative device weight)
--cpu-shares CPU shares (relative weight)
--cap-add=[] Add Linux capabilities
--cap-drop=[] Drop Linux capabilities
...
3:在docker中运行web服务器
使用以下命令,可以在容器中运行一个python的web服务器:
$ docker run -d -P training/webapp python app.py
这里使用的镜像是training/webapp,其中包含了简单的Python flask web应用。-d选项使容器后台运行,-P选项将容器中的端口映射到主机上的端口,后续会详细解释。
4:查看容器
使用docker ps命令查看刚刚运行的容器:
[hh_93_197 /]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
026fcbe4b3dd training/webapp "python app.py" 23 hours ago Up 3 seconds 0.0.0.0:32770->5000/tcp stoic_davinci
docker ps命令,加上-l选项,可以列出最后一个启动的容器,docker ps命令只能列出运行状态的容器,通过-a选项,可以列出所有状态的容器。
这里,在PORTS列下的信息是;0.0.0.0:32770->5000/tcp,因为在docker run中指定了-P选项,因此docker会将容器内的端口映射到主机的端口上,这里就是将容器的tcp端口5000映射到主机的32770端口上。因此,访问主机的32770端口,实际访问的就是容器中的5000端口(默认的Python flask端口):
使用-p选项,也可以自行指定容器和主机之间的端口映射关系,比如下面的命令:
[hh_93_197 /]# docker run -d -p 80:5000 training/webapp python app.py
该命令就将容器的5000映射到主机上的80端口了:
使用docker port命令,可以查看容器的端口映射情况:
[hh_93_197 /]# docker port sad_archimedes
5000/tcp -> 0.0.0.0:80
使用docker logs命令查看容器的日志:
[hh_93_197 /]# docker logs -f sad_archimedes
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
10.1.80.66 - - [16/Mar/2016 07:41:30] "GET / HTTP/1.1" 200 -
10.1.80.66 - - [16/Mar/2016 07:41:30] "GET /favicon.ico HTTP/1.1" 404 -
10.1.80.66 - - [16/Mar/2016 07:41:33] "GET / HTTP/1.1" 200 -
...
这里的-f选项,类似于tail -f中的选项。
使用docker top命令,可以查看容器中运行的进程:
[hh_93_197 /]# docker top sad_archimedes
UID PID PPID C STIME TTY TIME CMD
root 21864 24559 0 15:40 ? 00:00:00 python app.py
可见容器中只运行了python的web应用。
使用docker inspect命令,可以获得容器的更详细的信息,该命令返回一个JSON格式信息:
[hh_93_197 /]# docker inspect sad_archimedes
[
{
"Id": "a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162",
"Created": "2016-03-16T07:40:27.345500271Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 21864,
"ExitCode": 0,
"Error": "",
"StartedAt": "2016-03-16T07:40:27.726836748Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
"ResolvConfPath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/hostname",
"HostsPath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/hosts",
"LogPath": "/var/lib/docker/containers/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162/a7910dd9cafff213db102d679de6a71b2051f980c6d46c3080870973f39af162-json.log",
"Name": "/sad_archimedes",
"RestartCount": 0,
"Driver": "devicemapper",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"5000/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"ShmSize": 67108864,
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"KernelMemory": 0,
"Memory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": -1,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null
},
"GraphDriver": {
"Name": "devicemapper",
"Data": {
"DeviceId": "66",
"DeviceName": "docker-8:6-538261252-268466c24d896a48119782e8aaf98fc2acf786ce8db86a806b0bddace665169d",
"DeviceSize": "10737418240"
}
},
"Mounts": [],
"Config": {
"Hostname": "a7910dd9caff",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"5000/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"python",
"app.py"
],
"Image": "training/webapp",
"Volumes": null,
"WorkingDir": "/opt/webapp",
"Entrypoint": null,
"OnBuild": null,
"Labels": {},
"StopSignal": "SIGTERM"
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "b41b21041836349d572454db6822fdd8b1128762ec83a8d2fcad7c31de93fcfc",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"5000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "80"
}
]
},
"SandboxKey": "/var/run/docker/netns/b41b21041836",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "ef7147d741b0a2da2dc768fd23bd9433436a52bedf5773132cbefb6457fe0077",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "4948e842e58f3fedd25afe97bf292d53d7023ddeb90fefb7825103b56c5251b8",
"EndpointID": "ef7147d741b0a2da2dc768fd23bd9433436a52bedf5773132cbefb6457fe0077",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
}
]
还可以返回特定的信息:
[hh_93_197 /]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sad_archimedes
172.17.0.2
5:容器的导入和导出
可以使用docker export命令,将容器导出到本地文件:
[hh_93_197 ~]# docker export fa0fecad952f > ubuntu.tar
查看ubuntu.tar的内容:
可以使用docker import命令,从容器快照文件中再导入为镜像:
[hh_93_197 ~]# cat ubuntu.tar | docker import - test/ubuntu:v1.0
sha256:50288f29d8ad89d09f0a341201a9118118b7d7314466b2c14cea9184734a1056
[hh_93_197 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1.0 50288f29d8ad 9 seconds ago 187.7 MB
6:停止,启动、删除容器
使用docker stop命令可以停止容器,使用docker start命令可以启动容器,使用docker rm命令可以删除容器,注意删除之前必须先停止容器。
三:镜像
docker中,镜像是容器的基础。每次运行docker run命令时,必须指定要使用的镜像。运行容器时,docker首先在docker主机上查找镜像,找不到则去镜像仓库Docker Hub Registry中寻找。
1:列出主机上的镜像
使用docker images命令可以列出主机上本地镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 1d073211c498 3 days ago 187.9 MB
busybox latest 2c5ac3f849df 5 days ago 1.113 MB
training/webapp latest 54bb4e8718e8 5 months ago 348.7 MB
一般镜像库保存着一个镜像的多个版本,比如ubuntu镜像就有10.04, 12.04, 12.10, 13.04, 13.10和14.04版本。这些版本通过tag来区分,比如:ubuntu:14.04。所以,docker命令中指定镜像tag的例子如下:
$ docker run -t -i ubuntu:14.04 /bin/bash
如果不指定tag,则docker使用最新的镜像:ubuntu:latest。
2:下载新的镜像
使用docker pull命令可以下载镜像,比如:
$ docker pull centos
Pulling repository centos
b7de3133ff98: Pulling dependent layers
5cc9e91966f7: Pulling fs layer
511136ea3c5a: Download complete
ef52fb1fe610: Download complete
. . . Status: Downloaded newer image for centos
3:查找镜像
可以在Dcoker Hub(https://hub.docker.com/)上查找镜像,也可以使用命令docker search来查找,比如想找所有安装了Sinatra的镜像,可以:
$ docker search sinatra
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
training/sinatra Sinatra training image 0 [OK]
marceldegraaf/sinatra Sinatra test app 0
mattwarren/docker-sinatra-demo 0 [OK]
luisbebop/docker-sinatra-hello-world 0 [OK]
bmorearty/handson-sinatra handson-ruby + Sinatra for Hands on with D... 0
subwiz/sinatra 0
bmorearty/sinatra 0
. . .
注意,Official Repositories指的是由Docker公司维护的镜像,Automated
Builds 指的是允许验证源和内容的镜像。
像ubuntu这种形式的镜像,称为基或者根镜像,它们是由docker公司构建、验证和支持的。像training/sinatra这样的镜像,是从属于某个docker社区成员的用户镜像,由该Docker社区成员构建并维护,这些镜像总是以创建镜像的用户名为前缀,比如这里的training。
想要下载training/sinatra镜像,可以这样:$docker pull training/sinatra
4:创建自己的镜像
可以通过以下两种方式升级和创建镜像。
a:可以在某个镜像基础上,创建并提交新的镜像;
b:可以通过Dockerfile来指定创建镜像的命令;
a:升级并提交一个镜像
要升级一个镜像,首选需要创建一个基于该镜像的容器:
[hh_93_197 /]# docker run -t -i ubuntu /bin/bash
root@8ff95f120ff2:/#
比如这里在/tmp目录下创建一个readme.txt,当做升级镜像的动作:
root@0843755bad78:/# cd /tmp
root@0843755bad78:/tmp# cat readme.txt
this is my image
然后直接运行exit命令退出,这样容器就停止了。此时,可以根据该容器,使用docker commit命令创建一个新的镜像:
[hh_93_197 /]# docker commit -m "Added readme.txt" -a "hh" 0843755bad78 hh/ubuntu:v1
sha256:554a3b147ad10933c7643c65241f02b87d55bf4342f14a852aefe7ff04344a2e
这里使用了-m和-a选项。-m选项后跟一个注释信息(类似于git的-m命令),-a命令用于指定作者。接下来就是指定根据哪个容器创建镜像了,这里0843755bad78就是该容器的ID,然后就是新镜像的名称和tag:hh/ubuntu:v1,其中包含了新镜像的用户名hh,镜像的名称ubuntu,以及镜像的tag :v1.
使用docker images命令查看镜像:
[hh_93_197 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hh/ubuntu v1 554a3b147ad1 3 minutes ago 187.9 MB
docker-whale latest 1b1c047367b4 47 hours ago 247 MB
ubuntu latest 07c86167cdc4 12 days ago 187.9 MB
hello-world latest 690ed74de00f 5 months ago 960 B
docker/whalesay latest 6b362a9f73eb 9 months ago 247 MB
training/webapp latest 6fae60ef3446 10 months ago 348.7 MB
使用新的镜像创建一个容器:
[hh_93_197 /]# docker run -i -t hh/ubuntu:v1 /bin/bash
root@88400cbc3e23:/# cat /tmp/readme.txt
this is my image
可见,该容器中确实是有/tmp/readme.txt文件的。
b:根据Dockerfile创建镜像
使用docker commit创建镜像有些麻烦且不易于分享。可以使用docker build命令,根据Dockerfile创建镜像。
首先需要创建一个Dockerfile文件,该文件包含了构建镜像的一系列指令:
[hh_93_197 ~]# mkdir ubuntu_hh
[hh_93_197 ~]# cd ubuntu_hh/
[hh_93_197 ~/ubuntu_hh]# touch Dockerfile
在Dockerfile文件中,每条指令都创建了镜像的一个新的层(镜像是分层的),简单的例子如下:
# This is a comment
FROM ubuntu:latest
MAINTAINER hh
RUN touch /tmp/readme.txt
RUN echo "this is my ubuntu V2" >> /tmp/readme.txt
Dockerfile中,以”#”开头的是注释语句,每条指令以一个大写的声明开始。第一条FROM指令用于告诉docker新建的镜像以哪个镜像为基础,这里以ubuntu:latest为基础创建新镜像。MAINTAINER用于指定镜像的作者。
之后是两个RUN指令,每条RUN指令用于在镜像中运行命令,这里首先是新建文件/tmp/readme.txt,然后将"this is my ubuntu V2"写入该文件。
现在,根据该Dockerfile,使用docker build命令创建新镜像:
[hh_93_197 ~/ubuntu_hh]# docker build -t hh/ubuntu:v2 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu:latest
---> 07c86167cdc4
Step 2 : MAINTAINER hh
---> Running in 249d7e34ce6b
---> b77f4b33c9ab
Removing intermediate container 249d7e34ce6b
Step 3 : RUN touch /tmp/readme.txt
---> Running in 23c8fdeeca89
---> 447a799e19f4
Removing intermediate container 23c8fdeeca89
Step 4 : RUN echo "this is my ubuntu V2" >> /tmp/readme.txt
---> Running in 758d510038a3
---> 450ca66f56da
Removing intermediate container 758d510038a3
Successfully built 450ca66f56da
使用-t选项,指定新镜像的作者为hh,镜像名称为ubuntu,tag为v2。而且指定当前目录作为Dockerfile文件所在的目录,当然也可以指定Dockerfile所在目录的绝对路径。
运行该命令之后,docker首先upload构建环境:基本上就是构建目录的内容;接下来就是执行Dockerfile文件中每一条指令,可以看见每条指令都创建一个新的临时容器,然后在容器中运行指令(比如:---> Running in 23c8fdeeca89),然后提交容器的变化(跟docker commit类似),生成一个临时镜像(比如:--->
b77f4b33c9ab),然后删除临时容器(Removing intermediate container 249d7e34ce6b)。
最后,当所有指令执行完成之后,新的镜像就构建成功了,这里的镜像ID是450ca66f56da。所有的临时镜像也都被删除了,使用docker images查看新建的镜像:
[hh_93_197 ~/ubuntu_hh]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hh/ubuntu v2 450ca66f56da 36 seconds ago 187.9 MB
hh/ubuntu v1 554a3b147ad1 27 minutes ago 187.9 MB
docker-whale latest 1b1c047367b4 47 hours ago 247 MB
ubuntu latest 07c86167cdc4 12 days ago 187.9 MB
hello-world latest 690ed74de00f 5 months ago 960 B
docker/whalesay latest 6b362a9f73eb 9 months ago 247 MB
training/webapp latest 6fae60ef3446 10 months ago 348.7 MB
可以根据新建的镜像运行一个容器:
[hh_93_197 ~/ubuntu_hh]# docker run -t -i hh/ubuntu:v2 /bin/bash
root@b6f9f8bbe491:/# cat /tmp/readme.txt
this is my ubuntu V2
5:更改镜像的tag
可以使用docker tag命令更改一个镜像的tag,比如:
docker tag 450ca66f56da ouruser/sinatra:devel
使用docker images查看镜像,发现同一个镜像ID具有多个标签:
[hh_93_197 ~/ubuntu_hh]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hh/ubuntu v2 450ca66f56da 28 minutes ago 187.9 MB
ouruser/sinatra devel 450ca66f56da 28 minutes ago 187.9 MB
...
6:镜像摘要
使用V2或者更新格式的镜像,具有一个叫做摘要的可寻址内容的标识符。只要用于创建镜像的输入不变,则镜像的摘要值就是可预期的,列出镜像的摘要值,可以在docker images中使用--digests选项:
$ docker images --digests | head
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
ouruser/sinatra latest sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 5db5f8471261 11 hours ago 446.7 MB
当从2.0的镜像库push或者pull时,push或pull命令的输出包含摘要信息,可以在pull时使用摘要信息:
$ docker pull ouruser/sinatra@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf
也可以在create、run和rmi命令中,以及Dockerfile中的FROM指令中,使用摘要指定镜像。
7:镜像的导入和导出
使用docker save命令,可以导出镜像到本地文件:
[hh_93_197 ~]# docker save -o ubuntu.tar ubuntu
查看ubuntu.tar的内容:
使用docker load命令,可以将本地文件导入到本地镜像库,比如:
[hh_93_197 ~]# docker load --input ubuntu.tar
或者
[hh_93_197 ~]# docker load < ubuntu.tar
注意:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
8:其他
可以使用docker push命令,将新建的镜像上传至Docker Hub。
可以使用docker rmi命令删除本地的镜像。删除镜像前,需要确认没有基于该镜像的容器运行。
https://docs.docker.com/engine/userguide/containers/dockerizing/
https://docs.docker.com/engine/userguide/containers/usingdocker/
https://docs.docker.com/engine/userguide/containers/dockerimages/
01docker简单使用和配置(容器、镜像)的更多相关文章
- Kubernetes — 深入理解容器镜像
而正如我前面所说的,Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”:而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙.这么一折 ...
- Harbor实现容器镜像仓库的管理和运维
本次分享主要讲述了在开发运维中的管理容器镜像方法.为了便于说明原理,较多地使用Harbor作为例子. 内容主要包括: 开发和生产环境中镜像仓库的权限控制: 镜像远程同步(复制)的原理: 大规模应用镜像 ...
- Java应用在docker环境配置容器健康检查
在<极速体验docker容器健康>一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看. 实战环境信息 操作系统:macO ...
- 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器
为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...
- 使用jdk 容器镜像注意默认编码问题
最近在使用一个开源数据pipeline 处理的工具的时候,发现了jdk容器镜像编码的一些问题 以下是一个简单的描述 问题 使用了streamsets 工具,使用容器运行,默认使用了adoptopenj ...
- 使用nodejs+ harbor rest api 进行容器镜像迁移
最近因为基础设施调整,需要进行harbor 镜像仓库的迁移,主要是旧版本很老了,不想使用,直接 打算部署新的,原以为直接使用复制功能就可以,但是发现版本差异太大,直接失败,本打算使用中间 版本过度进行 ...
- 私有容器镜像仓库harbor
私有镜像仓库Harbor 1.Harbor概述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用 ...
- 云原生交付加速!容器镜像服务企业版支持 Helm Chart
2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...
- [Docker镜像] 关于阿里云容器镜像服务的使用(以天池比赛提交镜像为例)
最近在参加天池比赛,由于比赛需要使用阿里云容器镜像服务完成线上预测任务,所以花费了3-4天的时间了解并使用Docker完成相关镜像操作,在此分享下我学习的内容,以下是本文的目录结构: 介绍 镜像 容器 ...
随机推荐
- angular依赖注入(2)——注入器的使用
一.显示注入器 injector = ReflectiveInjector.resolveAndCreate([Car, Engine, Tires]); let car = injector.get ...
- php+js实现百度地图多点标注的方法
本文实例讲述了php+js实现百度地图多点标注的方法.分享给大家供大家参考,具体如下: 1.php创建json数据 ? 1 2 $products = $this->product_db-> ...
- Eclipse luna安装 Ivy
在线安装地址:http://www.apache.org/dist/ant/ivyde/updatesite
- appium+python 启动一个app步骤
询问度娘搭好appium和python环境,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧! 如何启动APP?1.获取包名:2.获取launcherActivit ...
- 洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]
P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...
- Python3 中 configparser 使用注意事项
在使用configparser时候应注意: ①配置文件(ini文件)的存放位置:配置文件和调用文件放在同一个文件包下面. 使用read()函数读取并解析配置文件时,直接写配置文件(ini文件)的文件名 ...
- Sql server定时执行某个sql 通过Windows 计划任务(非代理Job方式)
建立 bat文件.内容如下: osql -s "xxx.xxx.xx.x" -U sa -P sa -d DB -i TruncateSql.sql osql -S "l ...
- iView3.x Anchor(锚点)组件 导航锚点
iView3.x Anchor(锚点)组件 导航锚点 iview 3.x框架中新添了一个Anchor(锚点组件),用这个组件去做页面的分类导航正好合适,但是苦于官方文档太过抽象研究了一整天,才勉强可以 ...
- Leetcode925.Long Pressed Name长按键入
你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的名字(其中一 ...
- 【水滴石穿】ReactNativeDemo
这个博主他的功底算是特别棒的了,能够把一些基础的例子,通过精巧的方式布局在一个小的demo里面 很值得我学习 放上博主的链接:https://github.com/jianiuqi/ReactNati ...