0%

Docker学习

参考B站狂神说Docker教程,总结Docker学习

Docker 概述

Docker

一种小巧的虚拟化技术(虚拟机也是虚拟化技术,但比较笨重),基于GoLang开发

Docker出现原因

一款产品有两套环境

  • 线上环境
  • 开发环境

开发和部署环境就会比较麻烦,每一个机器都要部署环境,浪费时间。 那么我们项目文件能不能和环境一起打包发布呢?

传统方式:开发人员开发jar包,运维来上线

现在的方案:开发打包部署上线,一套流程完成

在这种需求下Docker应运而生!

Docker的核心思想

打包装箱,相互隔离
互不影响

Docker与虚拟机的差别

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,在此基础上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容,容器没有自己的内核,也没有虚拟硬件,更加轻便
  • 每个容器间石象湖隔离的,每个容器有自己的文件系统,互不影响

虚拟机
Docker

对DevOps(开发、运维)的意义

  1. 应用更快速的交付和部署
  2. 更便捷的升级和扩缩容
  3. 更简单的系统运维(开发测试环境高度一致)
  4. 更搞笑的计算资源利用

Docker构成

镜像(Image)

docker镜像累死一个模板可以用这个模板来创建容器服务,通过这个镜像可以创建多个容器

容器(Container)

容器技术独立运行一个或者一组应用,通过镜像来创建。
可以简单理解成一个简单的Linux系统

仓库(Repository)

仓库是存放镜像的地方

Docker安装

官方文档

启动服务

systemctl start docker

hello-world 测试

docker run hello-world

如果正常的话会出现如下输出

Unable to find image 'hello-world:latest' locally (无法在本地找到该镜像)
latest: Pulling from library/hello-world (从远程仓库拉取)
2db29710123e: Pull complete (拉取成功)
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest

Hello from Docker! (运行成功)
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

通过 docker images 查看本地所有镜像

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world latest feb5d9fea6a5 7 months ago 13.3kB

可见hello-world已经在本地存在

开启阿里云容器镜像加速服务

阿里云配置地址

选择相应操作系统,运行命令即可
例如

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker工作原理

Docker是一个C/S结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问。

DockerServer接收到DockerClient的命令就会执行。

工作原理

Docker为什么比虚拟机快?

  1. Docker具有比虚拟机更少的抽象层
  2. Docker利用的是宿主机的内核,vm需要虚拟化一个单独的内核(创建容器时,不需要重新加载一个操作系统内核,不需要进行引导)

Docker常用命令

docker version #版本信息
docker info #详细信息
docker 命令 --help # 帮助

镜像命令

docker images 查看本地所有镜像

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
  • REPOSITORY 仓库原
  • TAG 仓库标签
  • IMAGE ID 镜像id
  • CREATED 镜像的创建时间
  • SIZE 大小

可选项

  • -a 显示全部
  • -f 过滤
  • -q 仅显示id

docker search 搜索命令

[root@iZ8vbioqlrpr01woefafo2Z ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12483 [OK]
mariadb MariaDB Server is a high performing open sou… 4806 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 924 [OK]
percona Percona Server is a fork of the MySQL relati… 575 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 516 [OK]
# ......

可选项

  • filter --filter =stars=3000(收藏数大于3000的镜像)

docker pull 下载命令

默认使用最新版,等价于docker pull xx:latest

[root@iZ8vbioqlrpr01woefafo2Z ~]# docker pull mysql
Using default tag: latest # 默认最新版本
latest: Pulling from library/mysql
# 分层下载,docker image的核心 联合文件系统
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 前面
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

固定版本

docker pull mysql:5.7

[root@iZ8vbioqlrpr01woefafo2Z ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
# 会发现前面已经存在了这就是分层下载的好处!,重复的部分不需要重新下载了
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi -f + id

[root@iZ8vbioqlrpr01woefafo2Z ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 4 months ago 448MB
mysql latest 3218b38490ce 4 months ago 516MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
[root@iZ8vbioqlrpr01woefafo2Z ~]#
[root@iZ8vbioqlrpr01woefafo2Z ~]# docker rmi -f c20987f18b13
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
[root@iZ8vbioqlrpr01woefafo2Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 3218b38490ce 4 months ago 516MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB

docker rmi -f $(docker images -aq) 删除全部容器

安装一个centos镜像学习

docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

docker run [可选参数] image

参数说明

  • –name=”name” 给容器起名字
  • -d 后台方式运行
  • -it 使用交互方式运行,进入容器查看内容
  • -P 指定容器的端口(大写)
    • -p 主机端口:容器端口 映射
    • -p 容器端口
  • -p 随机端口(小写)

docker run -it centos /bin/bash 启动容器并用bash交互,可见内部也还是一个独立的centos系统

[root@iZ8vbioqlrpr01woefafo2Z ~]# docker run -it centos /bin/bash
[root@4a4d1f89c446 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@4a4d1f89c446 /]#

exit 退出主机

ctrl+p+q 容器不停止退出

docker ps 查看在运行的所有容器

  • -a 也会列出历史运行的容器
  • -n=? 显示最近创建的n个容器
  • -q 只显示id

docker rm 容器id 删除容器

不能删除正在运行的容器,如需要强制删除可以加-f
rmi是删除镜像 没有i是容器

docker rm -f $(docker ps -aq) 删除所有容器

docker start id 开启容器

docker restart id 重启容器

docker stop id 停止容器