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镜像的文件!命令参数脚本!

 

构建步骤:

 

  1.  编写一个dockerfile文件
  2.  docker build 构建称为一个镜像
  3.  docker run运行镜像
  4. docker push发布镜像(DockerHub 、阿里云仓库)

2、DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像,并提交!

 

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/

 

posted @ 2022-12-24 15:13  楸壳  阅读(57)  评论(0编辑  收藏  举报