Docker入门与实践
特性
|
容器
|
虚拟机
|
启动速度
|
秒级
|
分钟级
|
硬盘使用
|
一般为MB
|
一般为GB
|
性能
|
接近原生
|
弱于原生
|
系统支持量
|
单机支持上千个容器
|
一般几十个
|
隔离性
|
安全隔离
|
完全隔离
|
- 基础架构
#、下载docker-ce的yum源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i "s#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g" /etc/yum.repos.d/docker-ce.repo
yum makecache
#、yum下载docker-ce
yum install docker-ce -y #、docker的配置文件
/etc/docker/daemon.json #、启动docker服务
systemctl start docker #、 下载镜像
docker pull busyboxf
#、 登录docker hub
docker login -u [账号]
[root@CentOS7 ~]# docker login -u [账号]
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
三、、Docker常用命令
-i #以交互模式运行容器,通常与 -t 同时使用;
-t #为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d #后台运行容器,并返回容器ID;
--name="nginx-lb" #为容器指定一个名称;
--dns 8.8.8.8 #指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com #指定容器DNS搜索域名,默认和宿主一致;
-h "mars" #指定容器的hostname;
-e username="ritchie" #设置环境变量;
--env-file=[] #从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2" #绑定容器到指定CPU运行;
-m #设置容器使用内存最大值;
--net="bridge" #指定容器的网络连接类型支持bridge/host/none/container:<name|id> 四种类型;
--link=[] #添加链接到另一个容器;
--expose=[] # 开放一个端口或一组端口
-p #端口映射,格式为:主机(宿主)端口:容器端口
--config=~/.docker #客户端配置文件的位置
-D, --debug=false #启用Debug调试模式
-H, --host=[] #守护进程的套接字(Socket)连接
-h, --help=false #打印使用
-l, --log-level=info #设置日志级别
-v, --version=false #打印版本信息并退出
build #通过Dockerfile定制镜像
commit #提交当前容器为新的镜像
cp #从容器中拷贝指定文件或者目录到宿主机中或者从宿主机拷贝到容器
create #创建一个新的容器,同run 但不启动容器
diff #查看docker容器变化
events #从docker服务获取容器实时事件
exec #在已存在的容器上运行命令
export #导出容器的内容流作为一个tar归档文件(对应import)
history #展示一个镜像形成历史
images #列出系统当前镜像
import #从tar包中的内容创建一个新的文件系统映像(对应export)
info #显示系统相关信息
inspect #查看容器详细信息
kill #kill指定docker容器
load #从一个tar包中加载一个镜像(对应save)
login #登陆docker Hub服务器
logout #从当前Docker registry退出
logs #输出当前容器日志信息[-f 是实时查看]
pause #暂停容器
port #查看映射端口对应的容器内部源端口
ps #列出容器列表
pull #从docker镜像源服务器拉取指定镜像或者库镜像
push #上传指定镜像或者库镜像至docker源服务器
rename #重命名容器
restart #重启运行的容器
rm #移除一个或者多个容器
rmi #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run #创建一个新的容器并运行一个命令
save #保存一个镜像为一个tar包(对应load)
search #在dockerhub中搜索镜像
start #启动容器
stats #统计容器使用资源
stop #停止容器
tag #给源中镜像打标签
top #查看容器中运行的进程信息
unpause #取消暂停容器
version #查看容器版本号
wait #截取容器停止时的退出状态值
四、docker卷存储(挂载目录)
、 书卷 -v 的挂载方式
#将宿主机的/etc目录挂载到容器的/mnt目录 [root@CentOS7 ~]# docker run -it -v /etc/:/mnt/ busybox 、数据卷容器:--volumes-from
##数据卷容器:--volumes-from(复制其它容器的卷)
[root@CentOS7 ~]# docker run -it --name v1 -v /mnt/:/mnt/ busybox
/ # ls /mnt/
logstash-6.2..rpm
/ # [root@CentOS7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70bb436cb5d8 busybox "sh" seconds ago Up seconds v1
[root@CentOS7 ~]# docker run -it --name v2 --volumes-from v1 busybox
/ # ls /mnt/
logstash-6.2..rpm
五、docker网络
#、宿主机端口映射到容器 -P (大写P)从宿主机的3万多端口开始映射 (随机)
docker run -it -P nginx
[root@localhost~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
50bb17fcf9dd nginx "nginx -g 'daemon of…" seconds ago Up seconds 0.0.0.0:->/tcp cranky_zhukovsky
#浏览器访问 宿主机ip: #、指定映射端口 -p(小p)
docker run -it -p 【宿主机端口】:【容器端口】
docker run -itd -p : nginx
[root@localhost~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed6f6de58b09 nginx "nginx -g 'daemon of…" seconds ago Up seconds 0.0.0.0:->/tcp unruffled_shirley
#浏览器访问 宿主机ip 、共享网络名称空间
[root@CentOS7 ~]# docker run -it --name n1 busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/ brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # [root@CentOS7 ~]# docker run -it --name n2 --network container:n1 busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/ brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever ##测试
/ # hostname
854a346a1ae5
/ # echo > /tmp/index.html
/ # httpd -h /tmp/
/ # wget -O - -q 127.0.0.1 ##另一台
/ # hostname
854a346a1ae5
/ # wget -O - -q 127.0.0.1 #、修改docker0的默认ip
修改配置文件/etc/docker/daemon.json 例如
systemctl stop docker [root@CentOS7 ~]# cat /etc/docker/daemon.json
{
"bip": "192.168.0.1/16"
}
[root@CentOS7 ~]# systemctl daemon-reload
[root@CentOS7 ~]# systemctl start docker
[root@CentOS7 ~]# ip a s docker0
: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu qdisc noqueue state DOWN
link/ether ::8c::a3: brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/ brd 192.168.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80:::8cff:fe10:a365/ scope link
valid_lft forever preferred_lft forever
#、启动容器并在/tmp下创建index.html文件,然后退出
[root@localhost~]#docker run -it --name im1 busybox sh
/ # echo 'lalal' >/tmp/index.html
/ # exit
#、 创建镜像
[root@localhost~]docker commit -p im1 im1
sha256:ac4415503e78b162e7f03f16f0f0b3aa058ed57237b4315691eb15b8a27a7c97 #、更改docker创建容器后默认的运行命令
docker commit -a [作者] -c "修改执行的命令" 运行的容器 生成的容器名
[root@localhost~]#docker commit -a "作者 <804266500@qq.com>" -c "CMD /bin/ls /tmp/" im1 im2
sha256:9b755a5afec2c92f077ad02c273de2ffaca541bce06ffed8d9e633853c07ed8d
#运行im2镜像测试
[root@localhost~]#docker run -it im2
index.html
2、DockerFile(docker镜像源码)
[root@localhost~]#mkdir /img
[root@localhost~]#cd /img/
[root@localhostimg]#vim nginx.sh
[root@localhostimg]#cat nginx.sh
#!/bin/sh
cat>/etc/nginx/conf.d/www.conf<<EOF
server {
server_name $HOSTNAME;
listen ${PORT:-0.0.0.0:};
root ${NGINX_ROOT:-/usr/local/nginx/html};
charset utf-; }
EOF
exec "$@"
[root@localhostimg]#chmod +x nginx.sh
[root@localhostimg]#vim Dockerfile
[root@localhostimg]#cat Dockerfile
FROM nginx:1.15.-alpine
LABEL maintainer="zhang 1232@qq.com" ENV NGINX_ROOT="/data/www/html/"
#定义NGINX_ROOT变量
ADD nginx.sh /bin/
#将nginx.sh脚本添加到容器中的/bin/目录下载 RUN mkdir -p $NGINX_ROOT && \
echo '' > ${NGINX_ROOT}index.html
#在容器中执行命令 EXPOSE /tcp
#开放80端口 HEALTHCHECK --start-period=3s CMD wget -O - -q http://${HOSTNAME}
#容器运行3s后开始检测 30s检查一次,超时时间30s,失败次数3次 ONBUILD ADD https://mirrors.aliyun.com/centos/RPM-GPG-KEY-beta /tmp/
#后面基于这个dockerfile制作好的容器为基础镜像,再次build时,将aliyun源上的文件添加到/tmp目录 CMD ["/usr/sbin/nginx","-g","daemon off;"]
#将这条命令档次参数传给ENTRYPOINT ENTRYPOINT ["/bin/nginx.sh"]
#执行/bin/nginx.sh脚本
#Docker build构建镜像过程
[root@localhostimg]#docker build -t myimg:1.0 ./
Sending build context to Docker daemon .584kB
Step / : FROM nginx:1.15.-alpine
1.15.-alpine: Pulling from library/nginx
4fe2ade4980c: Already exists
82359930187f: Pull complete
dd73d113d335: Pull complete
4b94bac1a7e3: Pull complete
Digest: sha256:fd0361ff0882d63eec241705ba169d83c042bf27f8b568aedd131c2ab97246f0
Status: Downloaded newer image for nginx:1.15.-alpine
---> 33c5c6e11024
Step / : LABEL maintainer="zhangbin 1232@qq.com"
---> Running in f1c88d7cda87
Removing intermediate container f1c88d7cda87
---> 4cceaf0eaac2
Step / : ENV NGINX_ROOT="/data/www/html/"
---> Running in 5c1363aedd8e
Removing intermediate container 5c1363aedd8e
---> c437cfebc3d8
Step / : ADD nginx.sh /bin/
---> 80072bb635cf
Step / : RUN mkdir -p $NGINX_ROOT && echo '' > ${NGINX_ROOT}index.html
---> Running in 8153863c1e3e
Removing intermediate container 8153863c1e3e
---> e3423f795002
Step / : EXPOSE /tcp
---> Running in 9c774aad02a6
Removing intermediate container 9c774aad02a6
---> 4768345031f8
Step / : HEALTHCHECK --start-period=3s CMD wget -O - -q http://${HOSTNAME}
---> Running in 0fc235d2a345
Removing intermediate container 0fc235d2a345
---> da36e9bce34a
Step / : ONBUILD ADD https://mirrors.aliyun.com/centos/RPM-GPG-KEY-beta /tmp/
---> Running in f19b6f1865f7
Removing intermediate container f19b6f1865f7
---> 6e22946b4229
Step / : CMD ["/usr/sbin/nginx","-g","daemon off;"]
---> Running in 1e0207770aeb
Removing intermediate container 1e0207770aeb
---> 91e82dc16090
Step / : ENTRYPOINT ["/bin/nginx.sh"]
---> Running in 6524c3388c5d
Removing intermediate container 6524c3388c5d
---> ddcd2449914d
Successfully built ddcd2449914d #查看镜像
[root@localhostimg]#docker image ls|grep myimg
myimg 1.0 ddcd2449914d minutes ago .7MB #运行镜像
[root@localhostimg]#docker run -it --rm -P --name img01 myimg:1.0 #查看镜像
[root@localhostimg]#docker inspect img01|grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
[root@localhostimg]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3b7af4d54e0 myimg:1.0 "/bin/nginx.sh /usr/…" About a minute ago Up About a minute (healthy) 0.0.0.0:->/tcp img01
##测试
[root@localhostimg]#echo 172.17.0.3 e3b7af4d54e0 >>/etc/hosts
[root@localhostimg]#curl e3b7af4d54e0
七、资源限制
#下载测试镜像
[root@CentOS7 ~]# docker pull lorel/docker-stress-ng #内存测试
[root@CentOS7 ~]# docker run --name stress -it --rm -m 100M lorel/docker-stress-ng:latest strees --cpu --vm 90M
stress-ng: info: [] defaulting to a second run per stressor
stress-ng: info: [] dispatching hogs: cpu, vm
stress-ng: error: [] stress-ng-vm: fork failed: errno=: (Out of memory)
stress-ng: error: [] stress-ng-vm: fork failed: errno=: (Out of memory)
stress-ng: error: [] stress-ng-vm: fork failed: errno=: (Out of memory) #cpu测试
[root@CentOS7 ~]# docker run --name stress -it --rm --cpus lorel/docker-stress-ng:latest strees --cpu
stress-ng: info: [] defaulting to a second run per stressor
stress-ng: info: [] dispatching hogs: cpu
八、docker私有仓库
#、下载registry镜像并修改docker的配置文件
[root@localhost~]#docker pull registry
Using default tag: latest
latest: Pulling from library/registry
d6a5679aa3cf: Pull complete
ad0eac849f8f: Pull complete
2261ba058a15: Pull complete
f296fda86f10: Pull complete
bcd4a541795b: Pull complete
Digest: sha256:5a156ff125e5a12ac7fdec2b90b7e2ae5120fa249cf62248337b6d04abc574c8
Status: Downloaded newer image for registry:latest
[root@localhost~]#vim /etc/docker/daemon.json
{
"insecure-registries":["10.0.0.200:5000"]
} [root@localhost~]#systemctl stop docker
[root@localhost~]#systemctl daemon-reload
[root@localhost~]#systemctl start dockder #、启动镜像
[root@localhost~]#docker run -d -p : --restart=always --name registry registry #、登录 docker login IP:端口
docker login 10.0.0.200:
账号:admin
密码: [root@localhost~]#docker login 10.0.0.200:
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded #、测试
#4.1. tag一个镜像
docker tag nginx 10.0.0.200:/test/mynginx:v2
#4.2.然后push上去
docker push 10.0.0.200:/test/mynginx:v2
#4.3.打开网页查看镜像
http://10.0.0.200:5000/v2/_catalog
2、docker habor仓库
Docker入门与实践的更多相关文章
- 《Docker 入门与实践》 已经出版了~欢迎有须要的朋友关注。
在云计算时代.开发人员将应用转移到云上已经攻克了硬件管理的问题,然而软件配置和管理相关的问题依旧存在. Docker的出现正好能帮助软件开发人员开阔思路.尝试新的软件管理方法来解决问题. 通过掌握Do ...
- Docker入门到实践
1.什么是Docke 1.网上有很多 2.为什么要使用Docker? 优点 更高效的利用系统资源 更快速的启动时间 一致的运行环境 持续交付和部署 更轻松的迁移 更轻松的维护和扩展 3.Docker的 ...
- Docker 入门到实践(四)Docker 使用镜像
一.获取镜像 Docker Hub 上有大量的高质量的镜像让我们获取,命令为: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 具体的选项可以 ...
- Docker 入门到实践(三)Docker 安装
注意:不要在没有配置 Docker APT 源的情况下直接使用 apt 命令安装 Docker. 一.准备工作 系统要求 Docker CE 支持一下版本的 Ubuntu 操作系统 Cosmic 18 ...
- Docker入门与实践之 Dockerfile 语法详解
一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...
- Docker入门与实践之 docker安装与了解
一.Docker 概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...
- Docker入门到实践——简单操作
1.对比传统虚拟机总结 特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 2.基本概念 Docker包括三个基 ...
- Docker 入门实践
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张戈 导语 本文从新手视角记录了一个实际的Dokcer应用场景从创建.上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法 ...
- Docker 从入门到实践(一)Docker 简介
读前须知:本教程大部分都是[Docker 从入门到实践 ]一书的知识,有兴趣可以直接观看书籍.同时,借鉴书籍的知识,如有侵权,请告知我,我会删除处理.谢谢. 一.什么是 Docker? Docker ...
随机推荐
- 用golang chromedp 操作已经打开的chrome浏览器
win7 环境,主要是一开始想在代码中先用exec.Command启动chrome,但始终不能成功监听9222端口,折腾了很长时间, 需要先手工启动chrome监听端口,具体写在代码注释中了. 然后再 ...
- 11175-From D to E and Back(思维)
Problem UVA11175-From D to E and Back Accept: 164 Submit: 607Time Limit: 3000 mSec Problem Descript ...
- 图上最短路(Dijkstra, spfa)
单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来 ...
- 根据JavaBean创建数据库的操作SQL
根据JavaBean创建数据库的操作SQL import java.lang.reflect.Field; public class GenerateSQL { public static void ...
- Spring Security(十五):5.6 Authentication
Thus far we have only taken a look at the most basic authentication configuration. Let’s take a look ...
- lwip TCP client & FreeRTOS 打开TCP 的 保活机制 LWIP_TCP_KEEPALIVE==1
参考大神教程:http://blog.sina.com.cn/s/blog_62a85b950101aw8x.html 老衲五木 :http://blog.sina.com.cn/s/blog_6 ...
- AQS实现原理分析——ReentrantLock
在Java并发包java.util.concurrent中可以看到,不少源码是基于AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是Java并发包的基础工具类, ...
- JSP报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
今天使用Eclipse+Maven建立了一个Javaweb工程,并在eclipse中配置了Web容器Jboss eap 6.2.新建jsp页面,添加一个简单 的Java类.可是,JSP页面顶端出现“红 ...
- FineUIMvc v1.4.0 发布了(ASP.NET MVC控件库)!
FineUIMvc v1.4.0 已经于 2017-06-30 发布,FineUIMvc 是基于 jQuery 的专业 ASP.NET MVC 控件库,是我们的新产品.由于和 FineUI(专业版)共 ...
- Java系统高并发之Redis后端缓存优化
一:前端优化 暴露接口,按钮防重复(点击一次按钮后就变成禁用,禁止重复提交) 采用CDN存储静态化的页面和一些静态资源(css,js等) 二:Redis后端缓存优化 Redis 是完全开源免费的,遵守 ...