- go编写,13年诞生,开源
- 主流操作系统都支持docker,包括Windows和macos
- 云厂商都支持docker的服务
- 一次封装,到处运行
1.安装docker
- 目前docker引擎分为社区版(docker-CE)和企业版本(docker-EE)
- 官网:https://docs.docker.com/engine/install/centos/
核心概念
镜像(image)
- 类似于虚拟机镜像,但是它只是只读的(read-only)
- 文件和meta data的集合(root filesystem)
- 分层的,并且每一层都可以添加改变删除文件,成为一个新的image
- 镜像包含最基本的操作系统,里面仅仅安装apache应用程序(或者其它),称之为apache镜像
- 镜像是创建容器的基础
容器(Container)
容器是从镜像创建的应用运行实例
仓库(Repository)
- Docker仓库类似于代码仓库,是Docker级中存放镜像文件的场所
- 分为:公开仓库(public)和私有仓库(private)
- 最大的是官方的Docker Hub
- 国内的腾讯云,阿里云
- 支持本地创建私有仓库
设置存储库
安装yum-utils
软件包(提供yum-config-manager
实用程序)并设置稳定的存储库。
yum install -y yum-utils yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
安装DOCKER引擎
- 安装最新版本的Docker Engine和容器,或转到下一步以安装特定版本:
##知识点:docker-ce 和 docker -ee 等版本的区别 yum install docker-ce docker-ce-cli containerd.io
#启动Docker systemctl start docker #通过运行`hello-world` 映像来验证是否正确安装了Docker Engine 。 docker run hello-world #卸载Docker #卸载Docker Engine,CLI和Containerd软件包: yum remove docker-ce docker-ce-cli containerd.io #主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷: rm -rf /var/lib/docker #您必须手动删除所有已编辑的配置文件。
Docker 使用
## 列出本地镜像。 docker images [OPTIONS] [REPOSITORY[:TAG]] OPTIONS说明: -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层); --digests :显示镜像的摘要信息; -f :显示满足条件的镜像; --format :指定返回值的模板文件; --no-trunc :显示完整的镜像信息; -q :只显示镜像ID。
需要确认容器有在运行,可以通过 docker ps 来查看
#正在运行的容器可以使用 docker ps #已经退出了和正在运行的容器使用 docker ps -a [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8344d22e55a7 hello-world "/hello" 17 minutes ago Exited (0) 17 minutes ago mystifying_panini 输出详情介绍: CONTAINER ID: 容器 ID。 IMAGE: 使用的镜像。 COMMAND: 启动容器时运行的命令。 CREATED: 容器的创建时间。 STATUS: 容器状态。 状态有7种: created(已创建) restarting(重启中) running(运行中) removing(迁移中) paused(暂停) exited(停止) dead(死亡) PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。 NAMES: 自动分配的容器名称。
查看容器的基本信息
#可以查看版本,docker --version也可以 docker info
docker镜像
官方的Docker Hub 网站已经提供了N多镜像
## 查看 docker search CentOS ## 如果不换版本号,会使用最新版本的镜像 latest版本 docker pull centos:7 docker[image] pull NAME [ :TAG]
下载很慢的话,可以设置一个国内的docker hub代理 如下
##这个文件本身是没有的 所以用vim cat /etc/docker/daemon.json { "registry-mirrors":[ "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ] } ##接着重启docker生效 systemctl daemon-reload systemctl restart docker
运行centos镜像为容器
##将镜像运行成容器,同时进入容器运行/bin/bash docker run -it centos:7 /bin/bash #关于参数,可以使用 docker run --help 查看 想进入某一容器,复制它的id号 如果已退出,则 docker start [CONTAINER ID] 然后在进入容器 docker exec -it [CONTAINER ID] /bin/bash ## docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
如何查看镜像信息?
- 列出镜像
docker images docker image ls
- tag添加不同标签
docker tag centos:7 lampp:v1 docker images #会发现两个镜像id一样
- inspect命令查看详细信息
docker inspect lampp:v1 ##如果只查一个信息 docker inspect lampp:v1 -f {{".ContainerConfig"."Hostname"}}
- history命令查看镜像历史
docker history lampp:v1 --notrunc
- 删除清理镜像
docker rmi docker image rm ##参数 -f 强制删除,即便它有容器依赖 ## 参数 -no-prune 不要清理未带标签的父镜像 docker image prune -a -f ## 删除遗留的临时镜像文件,以及一些没有被使用的镜像 ## -a 删除所有无用镜像 ## -f 不进行提示,有点像rm -rf
- 创建镜像
- 将现有的容器变成镜像
- 模板倒入
- Dockerfile
#将现有容器变成镜像 docker run -it centos:7 /bin/bash yum install httpd ##进入容器安装服务 exit docker ps -a docker commit -m "Add httpd" -a "huangchao" 15961c18fb49 centos:v1 ##参数 -m 提交信息 ## -a 作者信息 docker inspect centos-httpd:v1 -f {{.Author}} docker history centos-httpd:v1
#模板导入 #下载模板 centos-7-x86_64-minimal.tar.gz wget http://openvz.mirror.digitalpacific.com.au/template/precreated/centos-7-x86_64-minimal.tar.gz #将模板导入变为镜像 cat centos-7-x86_64-minimal.tar.gz |docker import - centos7-min #查看 docker images #将镜像 centos7-min 运行为容器,进入到这个容器 docker run -itd centos7-min /bin/bash docker ps docker exec -it d7692b0efaad /bin/bash #把镜像导出为一个文件 #docker save -o 文件名 镜像名 docker save -o peng-centos7.tar centos7-min #将正在运行的容器删除 docker rm -f d7692b0efaad #删除镜像 docker rmi centos7-min #用文件恢复镜像 docker load < peng-centos7.tar docker load --input peng-centos7.tar #将自己的镜像传到dockerhub上去 docker push 镜像名
##Dockerfile 这是最常见的方式 vim Dockerfile #将以下复制写入 Dockerfile FROM contos:7 RUN yum install httpd -y && echo "i'm huangchao httpd testing" > /var/www/html/index.html EXPOSE 80 ENTRYPOINT(CMD) ["httpd", "-D" ,"FOREGROUND"] docker build -t centos-httpd:v2 . #查看是否成功 docker images #进去检查 --rm:运行报错或者退出容器,就会自动销毁删除 docker run -it --rm centos-httpd:v2 /bin/bash #启动容器并映射端口 docker run --name httpd --rm -it -p 8888:80 -d centos-httpd:v2 ##随机端口 -P (docker run --name httpdP --rm -it -P -d centos-httpd:v2) #查看是否成功 docker ps -------------------------------------- ##启动容器 docker run -d centos-httpd:v2
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
docker export 1e560fca3906 > ubuntu.tar
镜像的导出导入
我们可以把镜像导出到本地,然后传到其他机器上使用
docker save -o centos-httpd:v3.tar centos-httpd:v3 ## :会当作域名解析,会传不过去 mv centos-httpd\:v3.tar centosv3.tar ##scp传送慢则修改配置文件 vim /etc/ssh/sshd_config ##修改 UseDns no 和 GSSAPIAuthentication no systemctl restart sshd scp centos-httpd:v2.tar root@172.0.0.1:/tmp
将传过来的镜像导入
docker load -i centos-httpd:v2.tar 或者 docker load -i <centos-httpd:v2.tar
镜像的上传
- 一般来说就是上传到仓库,暂时都传到官方的docker hub中
- 官网:https://hub.docker.com/
#1.在linux中登录 docker login docker tag centos-httpd:v2 yl871012/centos:v2 #打标签 docker push yl871012/centos:v2 #上传 docker logout
使用Docker容器
- 新建容器(略)
docker create -it centos:7 docker ps -a #状态是created docker start [ID] #启动容器 docker exec -it [ID] /bin/bash
- 查看容器输出
docker logs -f -t [ID] # 参数 -f 持续保持输出 # -t 显示时间戳信息
- 新建并启动容器
#守护态运行 -d 表示后台运行 docker run --name test --rm -d -it centos:7 docker ps
- 停止容器
#暂停容器 docker pause [ID] #等待20s后停止容器 docker stop -t 20 [ID] #重启容器 docker restart [ID]
- 删除容器
#强制删除 docker rm xxx -f
- 容器的导入导出
#导出 #不管容器是什么状态都可以导出,up或者exit状态都可以 docker export -o up_test.tar [ID] 或者 docker exprot [ID] >up_test.tar #导入 #导入为镜像,命名为centos:v1.0 docker import up_test.tar -- centos:v1.0
- 查看容器
docker inspect [ID] -f {{".NetworkSettings"."IPAddress"}} # -f 过滤
- 查看容器内进程
docker top [ID]
- 查看统计信息
#单个容器状态 docker stats [ID] #只刷新一次,有点像top命令 docker stats [ID] --no-stream #所有容器 docker stats --all --format "table {{.CONTAINER}}\t{{.cpupERc}\t{{.MemUsage}}}"
load 和import有什么区别,都是导成镜像?
load 和import有什么区别,都是导成镜像? 1、import在导入数据的时候需要写入日志、load在导入数据的时候不需要写入日志。 2、import在导入数据的时候,目标表是可以进行访问和操作的,load只能进行select操作。 3、import在导入数据的时候,不能对索引模式进行选择,load可以。 4、import在导入数据的时候,不会使被导入数据表所属的表空间处于backup pending状态,而load会,当然如果load加nonrecoverable就可以避免表空间处于pending。 5、import在导入数据的时候,要进行各种约束性验证、触发器和参照完整性的约束,而load导入数据的时候只会进行性检查和非法值检查,不会进行完整性检查,不会调用触发器。
其他命令
- 复制文件
docker cp Dockerfile [ID]:/ docker cp [ID]:/Dockerfile ./
- 查看容器内文件的变更
docker diff [ID]
- 更新配置
docker inspect [ID] -f {{".HostConfig"."Memory"}} docker update [ID] -m 128M --memory-swap -1 #或者在docker run时直接指定也可以 docker run -it -m 200M centos-httpd:v4 /bin/bash
Docker仓库
虽然官方有仓库,官方也提供了本地仓库的搭建,但是我们还是选择了vmware的harbor
安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
安装并配置harbor
tar xvf harbor-offline-installer-v1.5.0.tgz cd harbor/ vim harbor.cfg # hostname=hub.tyyz.com #ui_url_protocol=http #harbor_admin_password=redhat ./install.sh docker ps #查看启动了很多容器 docker-compose up -d #如果系统重启后,我们需要使用这个命令来启动harbor #停止 do docker-compose down -v docker login http://hub.tyyz.com #在客户端登录harbor docker tag hello-world:latest hub.tyyz.com/centos/hello-world:lastest #打标签 docker push hub.tyyz.com/centos/hell-world:latest #推到仓库 docker pull hub.tyyz.com/centos/hello-world:latest #在其他客户端上从仓库拉取镜像(得提前login) ##如果登不上,需要在客户端设置如下 vim /etc/docker/daemon.json { "insecure-registries":["hub.tyyz.com"] } systemctl daemon-reload systemctl restart docker cat /etc/docker/daemon.json #所以daemon.json文件中应该有如下内容: { "registry-mirrors":[ "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ], "insecure-registries":["hub.tyyz.com"] } #注意 docker中安装完httpd服务后,使用命令systemctl start httpd.service,发现报错,错误信息:Failed to get D-Bus connection: Operation not permitted ##--privileged=true 赋予root权限 解决方法:使用命令docker run -d --name centos7 --privileged=true centos:7 /usr/sbin/init 创建容器,然后使用docker exec -it centos7 /bin/bash进入容器 #启动容器并映射端口 docker run -d --name httpd --rm -it -p 8888:80 --privileged=true centos:7 /usr/sbin/init docker run -d --name httpd -it -p 8888:80 --privileged=true centos:7 /usr/sbin/init #然后再进入 docker exec -it centos7 /bin/bash docker run -d --name httpda -it -p 8088:80 --privileged=true -v /var/www/html:/usr/local/apache2/htdocs httpd:latest /bin/bash 查看映射端口 docker port CONTAINER_ID
DOCKER 给运行中的容器添加映射端口
方法1 1、获得容器IP将container_name 换成实际环境中的容器名 docker inspect `container_name` | grep IPAddress 2.iptable转发端口,将容器的8000端口映射到docker主机的8001端口 iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000 方法2:利用docker commit新构镜像 1、停止docker容器 docker stop container01 2、commit该docker容器 docker commit container01 new_image:tag docker commit -m "Add httpd" -a "huangchao" 15961c18fb49 centos:v1 3、用前一步新生成的镜像重新起一个容器 docker run --name container02 -p 80:80 new_image:tag -------------------------------------------------------- ##先传到主机 scp uc.tar.gz root@172.24.79.7:/var/www/html ##主机在传入容器 docker cp /var/www/html/uc.tar.gz 28204adf5671:/var/www/html ##国内库下载mysql docker pull daocloud.io/library/mysql:5.7 # 初始化密码 docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7 docker run -itd -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=redhat -v /var/mysqldata/my.conf:/etc/my.cof -v=/var/mysqldata:/var/lib/mysql mysql:5.7 /bin/bash /var/lib/mysql ##启动nginx docker run --name nginx-test -p 9999:80 -d daocloud.io/library/nginx:latest
嗨,这是一条评论。
要开始审核、编辑及删除评论,请访问仪表盘的“评论”页面。
评论者头像来自Gravatar。
非常详细