docker 经常使用命令合集
文章目录
1、docker概论
- Docker 是一个开源的应用容器引擎,基于 Go 语言 并听从 Apache2.0 协议开源。
- Docker 可让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,而后发布到任何流行的 Linux
机器上,也能够实现虚拟化。 - 容器是彻底使用沙箱机制,相互之间不会有任何接口(相似 iPhone 的 app),更重要的是容器性能开销极低。
- Docker 从 17.03 版本以后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),咱们用社区版就能够了
2、Docker的应用场景
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其余的后台应用。
从头编译或者扩展示有的 OpenShift 或 Cloud Foundry 平台来搭建本身的 PaaS 环境。
html
2.1 Docker 的优势
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您可以将应用程序与基础架构分开,从而能够快速交付软件。借助 Docker,您能够与管理应用程序相同的方式来管理基础架构。经过利用 Docker 的方法来快速交付,测试和部署代码,您能够大大减小编写代码和在生产环境中运行代码之间的延迟。
(1)、快速,一致地交付您的应用程序
Docker 容许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工做,从而简化了开发的生命周期。
容器很是适合持续集成和持续交付(CI / CD)工做流程,请考虑如下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工做。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们能够在开发环境中对其进行修复,而后将其从新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境同样简单。
(2)、响应式部署和扩展
linux
Docker 是基于容器的平台,容许高度可移植的工做负载。Docker 容器能够在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可使您轻松地完成动态管理的工做负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
(3)、在同一硬件上运行更多工做负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,所以您能够利用更多的计算能力来实现业务目标。Docker 很是适合于高密度环境以及中小型部署,而您能够用更少的资源作更多的事情。
nginx
3、 Docker 架构
- Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就至关因而一个 root 文件系统。好比官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例同样,镜像是静态的定义,容器是镜像运行时的实体。容器能够被建立、启动、中止、删除、暂停等。
仓库(Repository):仓库可当作一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和建立Docker容器。
Docker 容器经过 Docker 镜像来建立。
容器与镜像的关系相似于面向对象编程中的对象与类。 - Docker 面向对象
- 容器 对象
- 镜像 类
4、 docker安装
- 部署19版docker
4.1安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
//yum-utils 提供了yum-config-manager
//device mapper 存储驱动程序须要device-mapper-persistent-data和lvm2
//device mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映射机制。
//它为实现用于存储资源管理的块设备驱动提供了一个而高度模块化的内核架构
4.2 设置阿里云镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.3安装docker-ce
yum -y install docker-ce systemctl start docker.service systemctl enable docker.service setenforce 0 vim /etc/selinux/config SELINUX=disabled
4.4 镜像加速
进入阿里云官网》》搜索镜像加速》》选择centos版的web
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://1i3tpy0i.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
4.5 网络优化
vim /etc/sysctl.conf net.ipv4.ip_forward=1 sysctl -p service network restart systemctl restart docker
5、docker 镜像使用
- 查看docker版本
docker version
- 搜索Nginx镜像(公有仓库)
docker search nginx
- 下载Nginx镜像
docker pull nginx
- 下载Redis官方最新镜像,至关于:docker pull redis:latest
docker pull redis
- 下载仓库全部Redis镜像
docker pull -a redis
- 下载私人仓库镜像
后面会详细介绍私有库的创建
docker pull bitnami/redis
- AUFS (联合文件系统) 若干层下载
- 下载后存放在 /var/lib/docker
- /var/lib/docker/image/overlay/repositories/json //下载文件信息
- 查看镜像列表
docker images //查看下载镜像信息 [root@localhost opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7e4d58f0e5f3 8 days ago 133MB REPOSITORY:表示镜像的仓库源 TAG:镜像的标签 IMAGE ID:镜像ID CREATED:镜像建立时间 SIZE:镜像大小 //含中间映像层 docker images -a //只显示镜像ID docker images -q //含中间映像层 docker images -qa //显示镜像摘要信息(DIGEST列) docker images --digests //显示镜像完整信息 docker images --no-trunc
- 获取镜像信息
docker inspect 7e4d58f0e5f3
- 添加新标签
docker tag nginx:latest nginx:web [root@localhost opt]# docker tag nginx:latest nginx:web [root@localhost opt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7e4d58f0e5f3 8 days ago 133MB nginx web 7e4d58f0e5f3 8 days ago 133MB //查看镜像Nginx信息 [root@localhost opt]# docker images | grep nginx nginx latest 7e4d58f0e5f3 8 days ago 133MB nginx web 7e4d58f0e5f3 8 days ago 133MB
- 删除镜像
docker rmi nginx:web (若是只有一个别名,那么这个就是删除docker。若是是多个标签,那么就是只是删除一个标签)
- 删除docker
docker rmi docker——id 注:删除docker若是有其余别名须要删除只剩一个,才能删除docker 在删除容器以前须要先中止容器
- 单个镜像删除,至关于:docker rmi redis:latest
docker rmi redis
- 强制删除(针对基于镜像有运行的容器进程)
docker rmi -f redis
- 多个镜像删除,不一样镜像间以空格间隔
docker rmi -f redis tomcat nginx
- 批量删除本地所有镜像
docker rmi -f $(docker images -q)
- 导出Nginx镜像命名为Nginx存放在目录opt下
docker save -o 文件名 镜像id或者镜像别名 [root@localhost ~] docker save -o /opt/nginx 7e4d58f0e5f3 [root@localhost opt] docker save -o nginx1 nginx:latest [root@localhost ~]cd /opt [root@localhost opt] ll 总用量 133636 drwx--x--x. 4 root root 28 9月 17 15:43 containerd -rw-------. 1 root root 136841216 9月 19 19:04 nginx drwxr-xr-x. 2 root root 6 10月 31 2018 rh
- 导入镜像
docker load --input 导出文件名redis
docker load < 导出文件名docker
[root@localhost opt] docker load --input nginx Loaded image ID: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d [root@localhost opt] docker load < nginx Loaded image ID: sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d [root@localhost opt] docker load --input nginx1 Loaded image: nginx:latest
6、docker容器的使用
- 容器建立
docker create -it nginx:latest /bin/bash [root@localhost opt] docker create -it nginx:latest /bin/bash 59c4c2f2b6a00bceb196f1bbcfe02fc5a2e16edc66feb12310c9474bf939d833
- -i: 交互式操做。
- -t: 终端。
- /bin/bash:放在镜像名后的是命令,这里咱们但愿有个交互式 Shell,所以用的是 /bin/bash。
- docker run :建立一个新的容器并运行一个命令
语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,一般与 -t 同时使用; -P: 随机端口映射,容器内部端口随机映射到主机的端口 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器从新分配一个伪输入终端,一般与 -i 同时使用; --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: 四种类型; --link=[]: 添加连接到另外一个容器; --expose=[]: 开放一个端口或一组端口; --volume , -v: 绑定一个卷 实例 使用docker镜像nginx:latest之后台模式启动一个容器,并将容器命名为mynginx。 docker run --name mynginx -d nginx:latest 使用镜像nginx:latest之后台模式启动一个容器,并将容器的80端口映射到主机随机端口。 docker run -P -d nginx:latest 使用镜像 nginx:latest,之后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。 docker run -p 80:80 -v /data:/data -d nginx:latest 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。 $ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。 runoob@runoob:~$ docker run -it nginx:latest /bin/bash
- 查看容器
docker ps -a [root@localhost opt] docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59c4c2f2b6a0 nginx:latest "/docker-entrypoint.…" 2 minutes ago Created pedantic_bose //显示最近建立容器 docker ps -l //显示最近建立的3个容器 docker ps -n 3 //不截断输出 docker ps --no-trunc //获取镜像redis的元信息 docker inspect redis //获取正在运行的容器redis的 IP docker inspect --format='{ {range .NetworkSettings.Networks}}{ {.IPAddress}}{ {end}}' redis //查看正在运行的容器 docker ps //查看正在运行的容器的ID docker ps -q //查看正在运行+历史运行过的容器 docker ps -a //显示运行容器总文件大小 docker ps -s
- 启动容器
docker start 59c4c2f2b6a0 查看镜像 up 状态 [root@localhost opt] docker start 59c4c2f2b6a0 59c4c2f2b6a0 [root@localhost opt] docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59c4c2f2b6a0 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 9 seconds 80/tcp pedantic_bose
- 中止容器
docker stop 容器ID
- 重启容器
docker restart 容器ID
- 启动执行命令查看系统根目录
docker pull centos 7
docker create it centos 7 /bin/bash
docker start 8c6dd3246eb4
docker run nginx /usr/bin/bash -c ls
-
执行完成直接关闭,状态是exited数据库
-
持续在后台执行apache
-
容器进入编程
[root@localhost opt] docker exec -it 8c6dd3246eb4 /bin/bash docker exec :在运行的容器中执行命令 -d :分离模式: 在后台运行 -i :即便没有附加也保持STDIN 打开 -t :分配一个伪终端 docker exec -i -t mynginx /bin/bash docker exec -it 9df70f9a0714 /bin/bash exit 退出
- 容器导出
docker export 8c6dd3246eb4 > nginx_c 8c6dd3246eb4:容器ID Nginx_c :导出容器文件名
- 容器导入(会生成镜像,而不会建立容器)
cat nginx_c | docker import - nginx:web nginx_c:导出的容器文件名 nginx:web:新的容器名
- 删除容器(容器必须在中止状态)
[root@localhost opt] docker rm 8c6dd3246eb4 Error response from daemon: You cannot remove a running container 8c6dd3246eb42099dbf58e2730f348acc21b685a4f27c60185d9a427e1282f09. Stop the container before attempting removal or force remove [root@localhost opt] docker stop 8c6dd3246eb4 8c6dd3246eb4 [root@localhost opt] docker rm 8c6dd3246eb4 8c6dd3246eb4
- 批量删除容器
方法一:docker ps -a | awk '{print "docker rm $1"}' | bash 方法二: [root@localhost opt]docker rm -f $(docker ps -aq) 395dab3d44df 2b52ff42681f 1627dc7213cd 960857ff1ba0 59c4c2f2b6a0 //强制杀死进程容器(处于运行状态才能杀死进程-docker start id) docker kill id
- 删除一个运行中的容器
docker rm -f redis
- 删除多个容器
docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
- -l 移除容器间的网络链接,链接名为 db
docker rm -l db
- -v 删除容器,并删除容器挂载的数据卷
docker rm -v redis
- 删除none镜像
vim none.sh docker ps -a | grep "Exited" | awk '{print $1}'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1}'|xargs docker rm docker images|grep none|awk '{print $3}'|xargs docker rmi
-
-f :经过 SIGKILL 信号强制删除一个运行中的容器。json
-
-l :移除容器间的网络链接,而非容器自己
-
-v :删除与容器关联的卷。
-
容器进程
//top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS] //列出redis容器中运行进程 docker top redis(容器ID) //查看全部运行容器的进程信息 for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
- 容器日志
//查看redis容器日志,默认参数 docker logs rabbitmq //查看redis容器日志,参数:-f 跟踪日志输出;-t 显示时间戳;--tail 仅列出最新N条容器日志; docker logs -f -t --tail=20 redis //查看容器redis从2019年05月21往后的最新10条日志。 docker logs --since="2019-05-21" --tail=10 redis
-
docker pause :暂停容器中全部的进程
-
docker unpause :恢复容器中全部的进程。
实例 暂停数据库容器db01提供服务。 docker pause db01 恢复数据库容器db01提供服务。 docker unpause db01
7、建立镜像
- 基于已有的镜像容器进行建立镜像
docker create -it jasonlix/docker-cobbler /bin/bash docker commit -m "new" -a "daoke" c83aee844ae0 daoke:test docker images | grep daoke
- 基于本地模板建立
将文件debian-7.0-x86-minimal.tar.gz拖至opt目录中 [root@localhost opt] cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new sha256:6683b936f5574560c919751a6622d4131bb7fb4d88f7a9614c55fb7f554ef2c0 [root@localhost opt] docker images | grep new daoke new 6683b936f557 13 seconds ago 215MB
- 基于dockerfile构建镜像
mkdir apache cd apache vim Dockerfile #基于的基础镜像 FROM centos #维护镜像的用户信息 MAINTAINER The project <cloud-ops@centos.org> #镜像操做指令安装Apache软件 RUN yum -y update RUN yum -y install httpd #开启80端口 EXPOSE 80 #复制网站首页文件 ADD index.html /var/www/html/index.html #将执行脚本复制到镜像中 ADD run.sh /run.sh RUN chmod 755 /run.sh #启动容器时执行脚本 CMD ["/run.sh"] vim run.sh #!/bin/bash rm -rf /run/httpd/* exec /usr/sbin/apachectl -D FOREGROUND echo "web test" > index.html
- 生产镜像
docker build -t httpd:centos1 . (注意别忘了末尾有“.”)
- 新镜像运行容器
docker run -d -p 1216:80 httpd:centos1 docker start 4fbc428fac3a (开启容器) [root@localhost apache]docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4fbc428fac3a httpd:centos1 "/run.sh" 8 seconds ago Up 7 seconds 0.0.0.0:1216->80/tcp affectionate_lovelace a4f43a12352e registry "/entrypoint.sh /etc…" 2 hours ago Exited (2) 40 minutes ago goofy_bose ba786a224305 registry "/entrypoint.sh /bin…" 2 hours ago Exited (127) 2 hours ago zen_hamilton
- 测试真机浏览器
- http://192.168.75.200:1216/
8、docker的数据管理
(1)数据管理操做
- 方便查看容器内产生的数据
- 多容器间实现数据共享
(2)两种管理方式
- 数据卷:宿主机和容器之间共享
- 数据卷容器: 容器与容器之间共享
- 数据卷:是一个提供容器使用的特殊目录
(3)建立数据卷
docker run -d -v /data1 -v /data2 --name web httpd:centos
- 挂载宿主机目录做为数据卷(宿主机目录与容器目录同步)
docker run -d -v /var/www:/data1 --name web-1 httpd:centos
- web-1 是指容器名,httpd:centos 是镜像,是指挂载一个目录而且生成一个容器web-1镜像为httpd 标签是centos
docker pull centos //宿主机目录/var/www挂载容器中的/data1 docker run -v /var/www:/data1 --name web1 -it centos /bin/bash cd /data1 touch test123 //返回宿主机进行查看 ls /var/www
- 数据卷容器
//数据卷容器
docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash ##(加/bin/bash 就是能够直接进入容器)
- 新容器挂载数据卷容器web100
docker run -it -volumes-from web100 --name db1 centos /bin/bash 注释:容器web100 和容器db1 所挂载的目录data1和data2 数据是同步运行的。
- 端口映射
docker run -d -p httpd:centos
docker run -d -p 49280:80 httpd:centos
docker ps -a
9、本地私有仓库创建
docker pull registry [root@localhost /]# docker pull registry Using default tag: latest latest: Pulling from library/registry cbdbe7a5bc2a: Pulling fs layer 47112e65547d: Pulling fs layer 46bcb632e506: Pulling fs layer c1cc712bcecd: Pulling fs layer 3db6272dcbfa: Pulling fs layer latest: Pulling from library/registry cbdbe7a5bc2a: Pulling fs layer 47112e65547d: Pulling fs layer 46bcb632e506: Pulling fs layer c1cc712bcecd: Pulling fs layer 3db6272dcbfa: Pulling fs layer open /var/lib/docker/tmp/GetImageBlob684407966: no space left on device --------------------------------------------------- vim /etc/docker/daemon.json { "insecure-registries":["192.168.75.200:5000"], //添加 "registry-mirrors": ["https://1i3tpy0i.mirror.aliyuncs.com"] } ~ systemctl restart docker.service docker create -it registry /bin/bash #新建容器 docker ps -a [root@localhost docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba786a224305 registry "/entrypoint.sh /bin…" 44 minutes ago Exited (127) 9 minutes ago zen_hamilton docker start 231d40e811cd ##开启(不是up是正确的) ##宿主机的/data/registry自动建立挂载容器中的/tmp/registry docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry docker pull httpd ##更改标记为192.168.75.200:5000/httpd docker tag httpd:latest 192.168.75.200:5000/httpd (标记IP地址与私有仓库的地址和端口相一致) docker push 192.168.75.200:5000/httpd ##上传镜像 ##获取私有仓库列表 curl -XGET http://192.168.75.200:500/v2/_catalog docker pull 192.168.75.200:500/httpd ##测试私有仓库下载镜像
- 端口映射
docker run -d -P httpd:centos ##随机分配外部的映射端口 docker run -d -p 43992:80 httpd:centos ##指定端口映射 docker ps -a ##查看
10、容器互联
(1)端口映射进行容器互联
- 建立并运行容器取名为web1,端口号自动映射
docker run -itd -P --name web1 ecntos /bin/bash
- 建立并运行容器取名web2,链接到web1和其通讯
docker run -itd -P --name web2 --link web1:web1 centos /bin/bash
- 进web2容器 ping web1
端口映射并非惟一把 docker 链接到另外一个容器的方法。
docker 有一个链接系统容许将多个容器链接在一块儿,共享链接信息。
docker 链接会建立一个父子关系,其中父容器能够看到子容器的信息。
(2)网络设置进行容器互联
新建网络 下面先建立一个新的 Docker 网络。 $ docker network create -d bridge test-net 参数说明: -d:参数指定 Docker 网络类型,有 bridge、overlay。 其中 overlay 网络类型用于 Swarm mode,在本小节中你能够忽略它。 链接容器 运行一个容器并链接到新建的 test-net 网络: $ docker run -itd --name test1 --network test-net ubuntu /bin/bash 打开新的终端,再运行一个容器并加入到 test-net 网络: $ docker run -itd --name test2 --network test-net ubuntu /bin/bash apt-get update apt install iputils-ping 下面经过 ping 来证实 test1 容器和 test2 容器创建了互联关系。 若是 test一、test2 容器内中无 ping 命令,则在容器内执行如下命令安装 ping(即学即用:能够在一个容器里安装好,提交容器到镜像,在以新的镜像从新运行以上俩个容器)。
11、总结
- docker的容器技术能够在一台主机上轻松为任何应用建立一个轻量级的、可移植的、自给自足的容器。
- 镜像、容器、仓库是docker的三大核心概念。
- dockerfile是一种被docker程序解释的脚本,dockerfile由多条的指令组成,每条指令对应Linux下面的一条命令。
- 管理docker容器中数据主要数据卷和数据卷容器方式。