Docker学习笔记
一、容器化技术相关概念
1、容器化技术概念
在软件开发过程中环境配置永远是最让人头疼的在开发之前我们需要准备各种运行环境、IDE及辅助工具同时软件部署也为程序员的谢顶助力三分。
搭建不同语言、不同技术栈适配的运行环境还要部署到多个服务器主机上并且这些主机还可能来自不同地方这为部署与运维人员带来了极大挑战。
而需求永远是推动技术发展的源动力正是在这样的背景下"容器化技术"出现了。
容器化实际上是一种轻量级的虚拟化技术。只不过相对于VM,属于进程级别的隔离(通过linux namespace实现),具备以下特点:
1)更大的弹性
2)更快的启动速度
3)更少的资源消耗
而最为大家熟悉的容器化运行时技术就非Docker莫属了。
2、Docker概念
Docker是一种容器化运行技术或平台,基于Linux内核的cgroup和namespace,对进程进行了封装隔离,属于操作系统层面虚拟化技术。它以容器的形式将你的应用程序及所有的依赖项打包在一起,以确保你的应用程序在任何环境中无缝运行。
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
3、Docker的基本组成
一个是Docker的客户端,一个是Docker的主机,一个是Docker的远程仓库:
构建完之后,我们需要去运行,运行是在docker的服务上面去运行的 ,Docker的守护进程中去运行,首先去镜像中去运行,这个镜像好比是一个Java类模板,运行的时候会产生很多的对象,这些一个个的对象就是我们的镜像
4、Docker镜像概念
docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
镜像是一种轻量级、可执行的独立软件包
,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码
、运行时
、库
、环境变量
和配置文件
。
所有的应用,直接打包docker镜像,就可以直接跑起来!
5、Docker容器概念
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。
6、仓库概念
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似git)
Docker Hub是国外的。
阿里云…都有容器服务器(配置镜像加速!)
7、安装
参考:https://blog.csdn.net/u012590718/article/details/125632482
https://docs.docker.com/engine/install/ubuntu/
二、Docker常用命令
1、帮助命令
docker version #显示docker的版本信息。 docker info #显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令
2、镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替 docker search 搜索镜像 docker pull 下载镜像 docker image pull docker rmi 删除镜像 docker image rm
docker images #查看所有本地主机上的镜像
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 4 months ago 13.3kB # 解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的ID CREATED 镜像的创建时间 SIZE 镜像的大小 # 可选项 -a, --all # 列出所有的镜像 -q, --quiet # 只显示镜像的id docker images -aq #显示所有镜像的id
docker search 搜索镜像
# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11138 [OK] mariadb MariaDB Server is a high performing open sou… 4221 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 829 [OK] percona Percona Server is a fork of the MySQL relati… 547 [OK] phpmyadmin phpMyAdmin - A web interface for MySQL and M… 274 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 89 mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 88 # 可选项 --filter=STARS=3000 # 搜索出来的镜像就死starts 大于3000的 # docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11138 [OK] mariadb MariaDB Server is a high performing open sou… 4221 [OK]
docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag] # docker pull mysql Using default tag: latest #如果不写tag的话,默认使用的就是latest latest: Pulling from library/mysql b4d181a07f80: Pull complete # 分层下载,docker images核心 联合文件系统 a462b60610f5: Pull complete 578fafb77ab8: Pull complete 524046006037: Pull complete d0cbe54c8855: Pull complete aa18e05cc46d: Pull complete 32ca814c833f: Pull complete 9ecc8abdb7f5: Pull complete ad042b682e0f: Pull complete 71d327c6bb78: Pull complete 165d1d10a3fa: Pull complete 2f40c47d0626: Pull complete Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真实地址 # 等价于 docker pull mysql docker pull docker.io/library/mysql:latest # 指定版本下载 # docker pull mysql:5.7 5.7: Pulling from library/mysql b4d181a07f80: Already exists a462b60610f5: Already exists 578fafb77ab8: Already exists 524046006037: Already exists d0cbe54c8855: Already exists aa18e05cc46d: Already exists 32ca814c833f: Already exists 52645b4af634: Pull complete bca6a5b14385: Pull complete 309f36297c75: Pull complete 7d75cacde0f8: Pull complete Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
docker rmi 删除镜像
# docker rmi -f 镜像id # 删除指定的镜像 # docker rmi -f 镜像id 镜像id 镜像id 镜像id # 删除多个镜像 # docker rmi -f $(docker images -aq) # 删除全部的镜像
3、容器命令
docker run 镜像id 新建容器并启动 docker ps 列出所有运行的容器 docker container list docker rm 容器id 删除指定容器 docker start 容器id #启动容器 docker restart容器id #重启容器 docker stop 容器id #停止当前正在运行的容器 docker kill 容器id #强制停止当前容器
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image # 参数说明 --name="Name" 容器名字 tomcat01 tomcat02, 用来区分容器 -d 后台方式运行 java常用的nohup -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -p 随机指定端口
zll@zll-device:~$ sudo docker run -it centos /bin/bash [root@ff47bc9d46c0 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr
# 从容器中退回主机
[root@ff47bc9d46c0 /]# exit
exit
我们此时发现,我们的主机名称发生了一些变化,新的这个主机名称,也就是我们的镜像的id:
docker ps 列出所有运行的容器
#docker ps命令 #列出当前正在运行的容器 # 列出当前正在运行的容器 -a # 列出当前正在运行的容器+带出历史运行过的容器 -n=? # 显示最近创建的容器 -q # 只显示容器的编号
zll@zll-device:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES zll@zll-device:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff47bc9d46c0 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago hungry_almeida 7cf3ab6e9ac2 hello-world "/hello" 36 minutes ago Exited (0) 36 minutes ago clever_newton
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器,如果要强制删除 rm -f docker rm -f $(docker ps -aq) # 删除所有的容器 docker ps -a -q | xargs docker rm # 删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前正在运行的容器 docker kill 容器id #强制停止当前容器
4、其他命令
后台启动容器
# 命令 docker run -d 镜像名!
zll@zll-device:~$ sudo docker run -d centos
af35c4d3dbc0cf9075b9d693c31432400d777e90cdbc931c7c4f8b0fe63220b7
zll@zll-device:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 问题docker ps,发现centos停止了
# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程, docker 发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
zll@zll-device:~$ sudo docker logs --help Usage: docker logs [OPTIONS] CONTAINER Fetch the logs of a container Options: --details Show extra details provided to logs -f, --follow Follow log output --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) -n, --tail string Number of lines to show from the end of the logs (default "all") -t, --timestamps Show timestamps --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
zll@zll-device:~$ sudo docker logs --since="2016-07-01" --tail=10 gifted_aryabhata
查看容器gifted_aryabhata从2016年7月1日后的最新10条日志。
查看容器中进程信息 ps
# 命令 docker top 容器id [root@iZuf65oftugvcjgk2jncyeZ /]# docker top b1177469c5ce UID PID PPID C STIME TTY TIME CMD root 44214 44195 0 13:35 ? 00:00:00 /bin/bash -c while true;do echo 666;sleep 1;done; root 44419 44214 0 13:38 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
三、DockerFile
1、DockerFile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建称为一个镜像
- docker run运行镜像
- docker push发布镜像(DockerHub 、阿里云仓库)
2、DockerFile构建过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序
- #表示注释
- 每一个指令都会创建提交一个新的镜像,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
-
DockerFile
:构建文件,定义了一切的步骤,源代码 -
DockerImages
:通过DockerFile构建生成的镜像,最终发布和运行产品。 -
Docker容器
:容器就是镜像运行起来提供服务。
3、DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建 centos MAINTAINER # 镜像是谁写的, 姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 暴露端口配置 和我们的-p一样的 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量!
4、实例:构建tomcat镜像
准备镜像文件
四、发布自己的镜像
1、地址 https://hub.docker.com/注册账号
2、确定这个账号可以登录
3、登录
[root@iZuf65oftugvcjgk2jncyeZ test]# docker login --help Usage: docker login [OPTIONS] [SERVER] Log in to a Docker registry. If no server is specified, the default is defined by the daemon. Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username
[root@iZuf65oftugvcjgk2jncyeZ test]# docker login -u liuhuanhuan963019 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、提交 push镜像.
# push自己的镜像到服务器上! [root@iZuf65oftugvcjgk2jncyeZ test]# docker push diytomcat Using default tag: latest The push refers to repository [docker.io/library/diytomcat] 48634880c0b2: Preparing 5a27e124f752: Preparing 280b959488cc: Preparing ce96dfda7353: Preparing 74ddd0ec08fa: Preparing denied: requested access to the resource is denie
此时提示我们push
失败,那么我们去修改下我们的镜像配置,我们给我们的容器新增一个tag
标签
[root@iZuf65oftugvcjgk2jncyeZ test]# docker tag df03f9daf7fc liuhuanhuan963019/diytomcat:1.0 [root@iZuf65oftugvcjgk2jncyeZ test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest df03f9daf7fc 3 days ago 677MB liuhuanhuan963019/diytomcat 1.0 df03f9daf7fc 3 days ago 677MB mysql 8.0 bbf6571db497 4 days ago 516MB nginx latest f652ca386ed1 4 days ago 141MB tomcat latest 904a98253fbf 2 weeks ago 680MB centos latest 5d0da3dc9764 2 months ago 231MB portainer/portainer latest 580c0e4e98b0 8 months ago 79.1MB
此时我们再去重新提交下看看:
[root@iZuf65oftugvcjgk2jncyeZ test]# docker push liuhuanhuan963019/diytomcat:1.0
此时提交的时候也是一层一层的去进行提交的,我们等待片刻,即可push成功了。
# 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library # 解决方法 # 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了 $ docker build -t chengcoder/mytomcat:0.1 . # 第二种 使用docker tag #然后再次push $ docker tag 容器id chengcoder/mytomcat:1.0 #然后再次push $ docker push kuangshen/tomcat:1.0
参考博客:https://huaweicloud.csdn.net/63311b69d3efff3090b52486.html?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Eactivity-2-123256877-blog-110742354.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Eactivity-2-123256877-blog-110742354.pc_relevant_aa&utm_relevant_index=3
https://www.runoob.com/docker/docker-tutorial.html
https://docs.docker.com/engine/scan/