概念上对比区分:物理机、虚拟机、容器
物理机相当于别墅,虚拟机相当于大楼,容器相当于胶囊房。
一个容器上只有一个服务,可移植性强;镜像作为标准的交付件,可在开发、测试、生产环境上以容器来运行,最终实现三套环境上的应用及依赖内容完全一致。
Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到热河流行的Linux机器上,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
Docker的三个概念:镜像、容器、仓库
镜像(Image):相当于一个root文件系统;镜像是用于创建容器的模板;
容器(Container):镜像和容器类似于类和实例,镜像是静态的定义,容器是镜像运行时的实体
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
centos7安装docker 18.06.1-ce
centos-release-7-7.1908.0.el7.centos.x86_64
0、卸载旧版本,基本第一次安装可以忽略该步骤
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
1、安装依赖包
yum install -y gcc gcc-c++ yum-utils device-mapper-persistent-data lvm2
设置稳定的仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
2、安装
从高到低列出Docker-ce的版本
yum list docker-ce.x86_64 --showduplicates | sort -r
安装指定版本,本次选择18.06.1.ce-3.el7
yum install -y docker-ce-18.06.1.ce-3.el7 docker-ce-cli-18.06.1.ce-3.el7 contained.io
3、测试docker,查看版本号
docker version
概念:Docker是一个开源的应用容器引擎,可移植的容器。一个完整的docker有以下几个部分组成:
1、DockerClient客户端
2、Docker Daemon守护进程
3、Docker Image镜像
4、DockerContainer容器
通过镜像来创建容器,镜像相当于类,容器相当于对象
Docker和VMware虚拟机相比,
Docker容器常用命令:
一、容器使用
启动Docker:systemctl start docker
通过运行hello-world映像验证是否正确安装了Docker Engine-Community:docker run hello-world
查看容器状态:docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4b5a376f8a8 ubuntu "/bin/bash" 10 seconds ago Up 10 seconds optimistic_perlman
CONTAINED ID:容器ID
IMAGE:使用的镜像
CREATED:容器创建的时间
STATUS:容器状态
共有其中状态:created(已创建)、restarting、running/up、removing(迁移中)、paused、exited(停止)、dead
PORTS:容器的端口信息和使用的连接类型(tcp\udp)
NAMES:自动分配的容器名称
查看容器内标准输出:docker logs 容器id/容器names
查看所有容器:docker ps -a
启动容器:docker run -itd 容器名称
i:交互式操作;t:终端;d:后台启动
进入容器:
docker attach 退出会导致容器停止
docker exec(推荐使用,退出不会导致停止容器)
导出和导入:
docker export 容器id > name.tar 导出容器快照到本地文件
cat docker/name.tar | docker import - test/ubuntu:v1 将快照文件name.tar导入到镜像text/ubuntu:v1
删除容器:docker rm -f 容器id
清理 所有处于终止状态的容器:docker container prune
运行一个web应用
载入镜像:docker pull training/webapp
启动:docker run -d -P training/webapp python app.py -P将容器内部的网络端口随机映射到使用的主机上
或者自定义映射端口:docker run -d -p 8083:5000 training/webapp python app.py
查看容器端口映射情况:docker port 容器id/容器名称
查看日志:docker logs -f 容器id/names 滚动看日志
docker rm 移除容器只能移除停止状态的容器
二、镜像使用
镜像列表:docker images
下载镜像:docker pull ubuntu:13.10
查找镜像:docker search httpd
删除镜像:docker rmi hello-world
创建镜像:docker build,需要先创建一个Dockerfile文件,包含以下内容
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
然后创建:docker build -t runoob/centos:6.7 . t指定镜像名 指定Dockerfile所在目录
为镜像添加一个新的标签:docker tag 镜像id centos:dev
更新镜像:创建一个容器docker run ,docker commit来提交容器副本 -m 描述 -a 作者 容器id 目标镜像名称(名称:版本)
三、Docker仓库 Docker Hub
登录/登出 docker login/logout
搜索:docker search
下载:docker pull ubuntu
推送:docker push username/ubuntu:dev
四、Dockerfile,定制镜像
新建Dockerfile文件,内容如下:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
FROM:定制的镜像都是基于FROM的镜像,这里的nginx就是定制需要的基础镜像,后续的操作都是基于nginx.
RUN:用于执行后面跟着的命令行命令,有以下两种格式:
shell格式:RUN <>
exec格式:RUN ["可执行文件","参数1","参数2"] RUN ./test.php dev offline
Dockerfile的指令每执行一次都会在docker上新建一层,可以使用&&连接符连接命令使之在同一层,避免过多无意义的层。
从容器中复制文件到系统,和普通的cp区别不大,容器的目录加了id/name:即可
docker cp 容器id/name:目录 系统目录
nginx
#自动生成的nginx.conf文件中指明了默认的配置,需要关掉 #include /etc/nginx/conf.d/*.conf;
docker run --name nginx81 -p 81:81 -v /bdl/docker/nginx/html/:/usr/share/nginx/html -v /bdl/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /bdl/docker/nginx/logs:/var/log/nginx -d nginx:1.14.2
mysql
docker run --name mysql -p 3306:3306 -v /bdl/docker/mysql/conf:/etc/mysql/conf.d -v /bdl/docker/mysql/logs:/var/log/mysql -v /bdl/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.28 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
redis
docker run -it --name redis -p 6379:6379 -d redis
docker部署springboot项目
Dockerfile文件,chmod +X 权限;应用jar包;tmp文件夹
# Dockerfile内容
FROM java:8
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD wtf.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
当前目录镜像构建
docker build -t xxl-job .
docker镜像离线打包部署
docker容器转镜像
# 将容器CONTAINER ID为6a4adf295f49 ,做成镜像,并命名为xxl-job-admin/1.0
docker commit 6a4adf295f49 xxl-job-admin/1.0
# 打包镜像xxl-job-admin/1.0到当前文件并命名为xxl-jab-admin1.0.jar
docker save -o xxl-jab-admin1.0.jar xxl-job-admin/1.0
导入镜像
# 导入镜像
docker load < xxl-jab-admin1.0.jar
# 查看镜像
docker images
# 运行容器
docker run --name xxl-job -p 8080:8080 -d xxl-job-admin/1.0
# 启动
docker start xxl-job-admin/1.0
docker常用命令
docker ps
docker images
docker build -t name .
docker run --name mysql -p 3306:3306 -v /bdl/docker/mysql/conf:/etc/mysql/conf.d -d mysql:5.7.28
docker stop mysql
docker start mysql
docker container prune
docker rm mysql
docker rmi mysql:5.7.28
docker logs mysql
docker exec -it mysql bash
docker search mysql
docker pull mysql:5.7.28
docker inspect mysql