docker

文章目录

docker简介

docker是一个开源的应用容器引擎,可以让开发人员把编写好的代码和运行代码所需要的环境打包进一个容器里,通过移植容器可以避免多次搭建环境以及代码在一台机器上可以运行而到了另一台机器上因环境问题报错。

区分镜像和容器
用户基于镜像来运行容器,可以把镜像和容器类比成类和对象

docker、dockerfile与docker-compose区别
docker是一个可以基于镜像创建容器的软件
dockerfile把手工安装docer镜像的过程变成一个配置文件脚本,以后只需要运行这个文件就可获得所需环境
docker-compose用于编排容器。通过编辑docker-composer.yml配置文件,可以一个命令启动多个需要不同参数配置的容器

docker和虚拟机的区别

简单来说docker不需要一个单独的客户机操作系统,而是借助了宿主机。(应该是这样)
docker_运维

ubuntu下安装docker

ubuntu下安装docker,一条命令即可
​​​curl -sSL https://get.daocloud.io/docker | sh​

镜像加速,去阿里云拿加速地址
​​​https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors​

$ sudo mkdir -p /etc/docker
$ vim /etc/docker/daemon.json

{
"registry-mirrors": ["加速器地址"]
}

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

docker基本命令

重启docker​​systemctl restart docker​

停止运行docker​​systemctl stop docker​

查看版本:​​docker version​

列出本地的镜像:​​docker images​

查找镜像:例​​docker search ubuntu​

拉取镜像:​​docker pull 镜像名[:版本]​

删除镜像:​​docker rmi ubuntu​

创建交互式容器:​​docker run -i -t --name=name1 centos /bin/bash​​​ -i:交互式容器
-t:tty终端
-d:守护式容器
–name:指定容器名称

查看正在运行的容器:​​docker ps​

查看运行过的容器:​​docker ps -a​

查看最后一次运行的容器:​​docker ps -l​

退出当前容器:​​exit​

创建守护式容器(不会自动登录进去):​​docker run -di --name=运行后的名字 镜像名字​​​ 登录进去​​docker exec -it 正在运行的容器名字 /bin/bash​​​​ctrl+p+q​​退出容器,但不关闭

创建容器并登录进去:​​docker run -it --name=运行后的名字 镜像名字 /bin/bash​

也可以用​​docker attach 容器名​

attach 不会在容器中创建进程执行额外的命令,只是附着到容器上.
exec会在运行的容器上创建进程执行新的命令。

停止运行容器:​​docker stop 容器名字​

开启已有的容器:​​docker start 容器名字​

docker start 指定一个容器
docker run 指定一个镜像

查看容器的详细信息:​​docker inspect c1​

删除容器:​​docker rm 容器名称/容器id​​ 注意不能删除正在运行的容器

文件拷贝:
​​​docker cp 待拷贝的文件或目录 容器名称:容器目录​​​​docker cp 容器名称:容器目录 带拷贝的文件或目录​

目录挂载
创建容器的时候,将宿主机的目录与容器的目录进行映射,这样就可以通过修改宿主机的某个目录文件去影响容器
-v 宿主机目录:容器目录
​​​docker run -di --name=自定义容器名 -v /opt/:/usr/local/myhtml 镜像名​​​​docker exec -it 容器名 /bin/bash​

docker搭建mysql、nginx、redis

mysql
​​​docker pull mysql:5.7​​​​docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7​

-di 守护方式交互方式
-p 3306:3306(端口映射-p 宿主机端口:容器端口)
-e MYSQL_ROOT_PASSWORD=root设置环境变量
mysql:5.7 镜像

​docker exec -it mysql /bin/bash​​​​docker -u root -p root​

nginx
​​​docker pull nginx​​​​docker run -di --name=nginx -p 80:80 nginx [可以创建的之后直接将容器文件挂载到宿主机某一目录]​

redis
​​​docker pull redis​​​​docker run -di --name=redis -p 6379:6379 redis​

容器/镜像打包

可以通过scp命令将打包的镜像上传到其他服务器(机器) ​​scp xx.tar 其他服务器ip:/root/xx.tar​


export容器打包:(但最好还是用save存储打包
1、容器打包:​​​docker export -o /root/xx.tar t1​​​ 2、导入容器:​​docker import xx.tar mytomcat:latest​


容器保存为镜像
​​​docker commit 容器名字 新镜像名字​

save镜像打包:​​docker save -o /root/xx.tar 新镜像名字​

导入镜像:​​docker load -i /root/xx.tar​​之后会产生一个新的镜像,之后一个正常使用

导出后再导入(exported-imported)的镜像会丢失所有的历史,而保存后再加载(saveed-loaded)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚来回滚之前的层)。

搭建私有镜像仓库

私有仓库本身也是一个镜像

拉取私有仓库镜像​​docker pull registry​

创建​​docker run -di --name=registry -p 5000:5000 registry​​​ 打开浏览器输入​​http://自己ip:5000/v2/_catalog​​,看到​​{"repositories":[]}​​ 表示私有仓库搭建成功并且内容为空

修改​​/etc/docker/daemon.json​​​,让docker信任私有仓库
添加​​​{"insecure-registries":["自己ip:5000"]}​

重启docker
​​​systemctl restart docker​

打标签
​​​docker tag jdk1.8(当前镜像名字) ip:5000/自己设定的标签名​

上传
​​​docker push ip:5000/自己设定的标签名​

拉取私有仓库镜像
先让docker信任私有仓库
修改​​​/etc/docker/daemon.json​​​添加​​{"insecure-registries":["自己ip:5000"]}​​​​docker pull 镜像名字​

Dockerfile文件

使用docker build和Dockerfile文件
Dockerfile使用基于DSL语法的指令来构建一个docker镜像,之后使用​​​docker bulider​​命令来构建一个新的镜像

DSL语法
docker_docker_02

构建镜像步骤:
1、创建一个目录
2、在目录下创建Dockerfile文件以及其他文件
3、通过docker builder构建景象
4、通过构建的镜像启动容器

示例

mv jdk-8u202-linux-x64.tar.gz /tmp
vim Dockerfile

FORM centos:7
MAINTAINER xxxx
WORKDIR /tmp
RUN mkdir /tmp/java
ADD jdk-8u202-linux-x64.tar.gz /tmp/java
ENV JAVA_HOME /tmp/java/jdk-1.8.0_202
ENV PATH $JAVA_HOME/bin:$PATH

运行Dokcerfile
docker bulid -t='jdk1.8' .
-t='jdk1.8'构建好的镜像名字
.是当前目录

docker网络管理

查看docker网络:​​docker network ls​

一、默认网络
在非集群环境下docker提供的默认网络
docker中默认网络分为bridge、host、none。
bridge可以与互联网通信,host和none不可以与外界网络通信
二、自定义网络
1、bridge
2、overlay network in swarm mode(swarm集群中的覆盖网络)
3、network plugin(定制网络插件)
举栗:
1、创建一个基于bridge的mynet网络,其中–driver用于指定网络驱动类型
​​​docker network create --driver bridge mynet​​​ 2、创建一个名为newtest的容器,–network指定了容器的网络连接为mynet
​docker run -itd --nmae=newtest --network=mynet hello-world​​ 3、为newteest容器添加一种默认的网络管理方式
​docker network connect bridge newtest​​ 4、断开网络连接
​docker network disconnect mynet newtest​​ 5、移除名mynet的自定义网络
​docker network rm mynet​

容器间的通信
1、创建两个使用默认bridge网络容器
​​​docker run -itd --name=c1 busybox​​​​docker run -itd --name=c2 busybox​​ 2、创建一个使用自定义的mynet网络(需要预先创建)的容器
​docker network create --driver bridge mynet​​​​docker run --network=mynet -itd --name=c3 busybox​​ 3、为容器2新增一个自定义的mynet网络连接
​docker network connect mynet c2​

此时容器c1和c3各有一块网卡,c2有两块网卡。
c1和c2, c2和c3可以通信,但是c1和c3不能通信。


swarm 集群网络

实际的服务环境是通过类似于反向代理的形式,将多个服务器通过一台服务器向外提供服务,而内部是通过swarm分配给各个服务器不同的节点来完成的。看了几篇博客,貌似是这个样子。

原文链接:https://blog.51cto.com/u_15457669/5391313

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享