Docker学习

一、docker了解

vmware: 基于硬件的虚拟技术
docker基于操作系统(Linux)层面的虚拟技术
文档地址:https://docs.docker.com/ Docker的文档是超级详细的

1.统一

  • 环境统一:(理解为JVM,可以处处运行)
  • 镜像统一:(理解为java的模板)
  • 容器统一:(理解为模板的实例化)

2.docker命令

  • docker images: 查看所有的镜像

  • docker search + 镜像名称: 搜索【镜像名称】

  • docker pull +镜像名称+ : + 版本号或者latest : 拉取镜像
    示例:
    docker pull ascdc/jdk8:latest

  • docker run: 创建一个新的容器
    示例:docker run -d --name=cktest -p 10086:10086 test
    test:填入镜像名字

    • 参数-name: 给容器起别名便于管理 例子:--name=jdk8
    • -d: 指定容器运行于前台还是后台 默认false
    • -p: 指定容器暴露的端口 例子:--name=tomcat8 -d -p 8180:8080 (8180代表宿主机对外暴露的端口,8080为容器的端口)
  • docker ps: 查看正在运行的容器

  • docker ps -a:查看所有容器

  • docker build -t + 镜像名字+位置: 创建一个镜像 例如(docker build -t test .)

  • docker stop + 容器名字:停掉容器

3.Docker安装

Docker的基本组成

  • 镜像(image):
    docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像>run>tomcat01容器(提供服务器)
    理解为java的模板(镜像);
  • 容器(container):
    Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
    启动,停止,删除,基本命令;
    理解为是模板(镜像)的实例化;
  • 仓库(repository):
    仓库就是存放镜像的地方;
    仓库共分为共有仓库和私有仓库;
    Docker Hub(默认是国外的)
    阿里云...都有容器服务器(配置镜像加速)

安装Docker

环境查看

# 系统内核是3.10以上的
[root@kvm-10-115-88-35 gadmin]# uname -r
3.10.0-327.el7.x86_64

# 系统版本
[root@kvm-10-115-88-35 gadmin]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

帮助文档:

# 1.卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 2.需要的安装包
sudo yum install -y yum-utils
# 3. 设置镜像仓库
 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的!
 
 sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用阿里云镜像

# 更新yum软件包索引
yum makecache fast

# 4. 安装docker相关的 docker-ce 社区版 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 5. 启动docker
systemctl start docker

# 6. 使用docker version测试是否启动成功
[root@kvm-10-115-88-35 package]# docker version
Client: Docker Engine - Community
 Version:           20.10.2
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        2291f61
 Built:             Mon Dec 28 16:17:48 2020
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.2
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8891c58
  Built:            Mon Dec 28 16:16:13 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# 7. 运行hello-world
docker run hello-world
# 8. 查看一下下载的这个 hello-world 镜像
[root@kvm-10-115-88-35 package]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

4.了解卸载Docker

# 1. 卸载依赖
 yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径

5.阿里云镜像加速

(1)、登录阿里云找到容器服务

(2)、找到镜像加速地址

(3)、配置使用

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://wm4wl1iw.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 回顾Helloworld流程

  2. 底层原理

Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

DockerServer接收到Docker-Client的指令,就会执行这个命令;

  1. Docker为什么比VM快?

1.Docker有着比虚拟机更少的抽象层

2.Docker利用的是宿主机的内核,vm需要是 Guest OS。

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级

学完所有的命令,再回过头来看上面的底层原理会非常清晰!

二、Docker的常用命令


帮助命令

docker version 	# 显示docker的版本信息
docker info		# 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 万能命令

帮助文档地址:https://docs.docker.com/reference/

镜像命令


docker images 查看所有本地主机上的镜像

[root@kvm-10-115-88-35 package]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG		   镜像的标签
IMAGE ID   镜像的id
CREATED		镜像的创建时间
SIZE		镜像的大小

#可选性
Options:
  -a, --all             # 列出所有镜像
  -q, --quiet           # 只显示镜像的id

docker search 搜索镜像

[root@kvm-10-115-88-35 package]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10380     [OK]       
mariadb                           MariaDB is a community-developed fork of MyS…   3848      [OK]       
# 可选项,通过收藏( STARS )来过滤
--filter=stars=5000  # 搜索出来的镜像是STARS是3000以上的
[root@kvm-10-115-88-35 package]# docker search mysql --filter=STARS=5000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10380     [OK]       

docker pull 下载镜像

# 下载镜像 docker pull 镜像名:tag[]
[root@kvm-10-115-88-35 package]# docker pull mysql
Using default tag: latest

# 指定版本下载
[root@kvm-10-115-88-35 package]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Pull complete 
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1831ac1245f4: Pull complete 
37677b8c1f79: Pull complete 
27e4ac3b0f6e: Pull complete 
7227baa8c445: Pull complete 
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7 

docker rmi 删除镜像

[root@kvm-10-115-88-35 package]# docker rmi -f 容器ID # 删除指定的容器
[root@kvm-10-115-88-35 package]# docker rmi -f 容器ID 容器ID 容器ID # 删除多个容器
[root@kvm-10-115-88-35 package]# docker rmi -f ${docker images -aq} # 删除全部的容器

容器命令


说明:我们有了镜像才可以创建容器,linux, 下载一个centos 镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image

# 参数说明
--name "Name"		容器名字 tomcat01 tomcat02 用来区分容器
-d				   后台方式运行
-it					使用交互方式运行,进入容器查看内容
-p					知道容器的端口 -p 8080:8080
	-p ip:主机端口:容器端口 (常用)
	-p 容器端口
	容器端口
-P					随机指定端口

# 测试, 启动并进入容器
[root@kvm-10-115-88-35 package]# docker run -it centos /bin/bash
[root@17548652da78 /]# 
[root@17548652da78 /]# ls	# 查看容器内的centos,基础版本很多命令不完善
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 从容器中退回到主机
[root@17548652da78 /]# exit
exit

列出所有运行的容器

# docker ps 命令
   # 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示服务器的编号
[root@kvm-10-115-88-35 package]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@kvm-10-115-88-35 package]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                          PORTS     NAMES
17548652da78   centos        "/bin/bash"   5 minutes ago   Exited (0) About a minute ago             tender_mcclintock
77147b7254fe   hello-world   "/hello"      4 hours ago     Exited (0) 4 hours ago                    optimistic_tereshkova

退出容器

exit # 直接容器停止并退出
Ctrl + p + q # 容器不停止退出

删除容器

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		# 强制停止当前正在运行的容器

常用其他命令


后台启动容器

# 命令docker run -d 镜像名
[root@kvm-10-115-88-35 package]# docker run -d centos
038359907d93f6cc8683fd7fd2baee94c4b4cb2cdb8b1409b0489645854778e4

# 问题docker ps, 发现centos 停止了

# 常见的坑,docker 容器使用后台运行, 就必须要有一个前台进程, docker发现没有应用, 就会自动停止

# nginx, 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs -f -t --tail 容器, 没有日志

# 自己编写一段shell脚本
[root@kvm-10-115-88-35 package]# docker run -d centos /bin/sh -c "while true;do echo kuangshen; sleep 1; done"

[root@kvm-10-115-88-35 package]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
585d8a7fe2de   centos    "/bin/sh -c 'while t…"   3 seconds ago   Up 2 seconds             cool_moser

# 显示日志
-tf				# 显示日志
--tail	number	# 要显示日志条数
[root@kvm-10-115-88-35 package]# docker logs -tf --tail 10 585d8a7fe2de
2021-01-20T08:44:29.401330891Z kuangshen
2021-01-20T08:44:30.403675336Z kuangshen

查看容器中进程信息ps

# 命令 docker top 容器id
[root@kvm-10-115-88-35 package]# docker top 1d3ec7603ae1
UID       PID      PPID       C         STIME       TTY              TIME                CMD
root     23677    23657       0        16:48       pts/0             00:00:00         /bin/bash

查看镜像的元数据

# 命令 docker inspect 容器id

# 测试
[root@kvm-10-115-88-35 package]# docker inspect 1d3ec7603ae1

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行的, 需要进入容器, 修改一些配置

# 命令
docker exec -it 容器id bashShell

# 测试
[root@kvm-10-115-88-35 package]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
1d3ec7603ae1   centos    "/bin/bash"   8 minutes ago   Up 8 minutes             unruffled_burnell
[root@kvm-10-115-88-35 package]# docker exec -it 1d3ec7603ae1 /bin/bash
[root@1d3ec7603ae1 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:48 pts/0    00:00:00 /bin/bash
root        16     0  0 08:57 pts/1    00:00:00 /bin/bash
root        30     0  1 08:59 pts/2    00:00:00 /bin/bash
root        44    30  0 08:59 pts/2    00:00:00 ps -ef
# 方式二
docker attach 容器id 
[root@kvm-10-115-88-35 package]# docker attach 1d3ec7603ae1
正在执行当前的代码

# docker exec		# 进入容器后开启一个新的终端,可以在里面操作, (常用)
# docker attach		# 进入容器正在执行的终端,不会启动新的进程!

从容器内拷贝文件到主机上

docker cp 容器id 容器内路径 目标的主机路径
# 查看当前主机目录下
[root@kvm-10-115-88-35 local]# ls
1.txt              bin  games     include   jmeter.log         kafka           lib    libexec  node_exporter  package     redis_loadtest  scripts  src        test.log
apache-jmeter-4.0  etc  heap.bin  influxdb  jmeter-server.log  kuangshen.java  lib64  nmon     openssh        prometheus  sbin            share    test.java  zookeeper

[root@kvm-10-115-88-35 local]# docker ps -a
CONTAINER ID   IMAGE   COMMAND       CREATED          STATUS      PORTS            NAMES
1d3ec7603ae1   centos  "/bin/bash"   21 minutes ago   Exited (127) 34 seconds ago         unruffled_burnell
# 进入容器内部
[root@kvm-10-115-88-35 local]# docker attach 1d3ec7603ae1
# 新建文件
[root@1d3ec7603ae1 local]# touch test.java
# 退出容器后将文件拷贝到主机上
[root@kvm-10-115-88-35 local]# docker cp 1d3ec7603ae1:/usr/local/test.java /usr/local/

# 拷贝是一个手动过程,未来我们使用 -v 卷的技术, 可以实现

学习方式: 将我的所有命令全部敲一遍,自己记录笔记

# 官方使用
docker run -it --rm tomcat:9.0  # 一般用来测试,用完就删除

# 下载在启动
docker pull tomcat:9.0

# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat

# 
posted @ 2021-01-26 10:33  Du先森  阅读(70)  评论(0)    收藏  举报