Docker学习笔记-入门


笔记来源:kuangstudy视频学习
学习链接

docker

1. docker安装-基于centOS

安装docker

  1. docker官方安装手册参考
  2. 根据官方文档要求,确认你是centos7以上系统
  3. yum安装gcc相关环境(需要确保 虚拟机可以上外网 )
yum -y install gcc
yum -y install gcc-c++
  1. 卸载旧版本
yum remove docker \
	docker-client \
	docker-client-latest \
	docker-common \
	docker-latest \
	docker-latest-logrotate \
	docker-logrotate \
	docker-engine
  1. 安装需要的软件包
yum install -y yum-utils
  1. 设置镜像仓库
# 错误
yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo
## 报错
[Errno 14] curl#35 - TCP connection reset by peer
[Errno 12] curl#35 - Timeout
# 正确推荐使用国内的
yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/
linux/centos/docker-ce.repo
  1. 更新yum软件包索引
yum makecache fast
  1. 安装docker CE
# docker ce 社区版	ee 企业版
yum install docker-ce docker-ce-cli containerd.io
  1. 启动docker
systemctl start docker
# 启动之后
docker version # 查看是否安装成功
  1. 测试命令
docker run hello-world	# 运行hello-world镜像
docker images	# 查看本机镜像
  1. 卸载
# 停止docker服务
systemctl stop docker
# 卸载依赖
yum -y remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker

# /var/lib/docker 是docker的工作路径

阿里云镜像加速

  1. 登录阿里云找到容器镜像服务

  1. 点击镜像加速器

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

2. run做了什么

底层原理

docker为什么比虚拟机快

1、docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在
docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在
效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机
一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建
一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主
机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

3. Docker的常用命令

帮助命令

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

帮助文档地址

镜像命令

docker images

docker images	# 查看镜像
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   14 months ago   13.3kB
# 解释
REPOSITORY	# 镜像的仓库源
TAG			# 镜像的标签
IMAGE ID	# 镜像的ID
CREATED		# 镜像的创建时间
SIZE		# 镜像的大小

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

docker search 搜索镜像

[root@izbp18quije14hodxrcq6rz ~]# docker search mysql
NAME         		DESCRIPTION                 STARS     OFFICIAL   AUTOMATED
mysql        		MySQL is a widely used...   10575     [OK]       
mariadb      		MariaDB Server is ...   	 3954     [OK]       
mysql/mysql-server  Optimized…   				  774                  [OK]
# 可选项,通过收藏来过滤
--filter=STARS=3000	# 会去找寻stars大于3000的

docker pull 下载镜像

docker pull 镜像名[:tag]
docker pull mysql	# 下载mysql镜像,默认下载最新
Using default tag: latest	# 如果不写tag,默认latest,下载最新
latest: Pulling from library/mysql
a076a628af6f: Pull complete 	# 以下是docker images核心,分层下载 联合文件系统
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
# digest: 签名信息
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
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
a076a628af6f: Already exists 
f6c208f3f991: Already exists 
88a9455a9165: Already exists 
406c9b8427c6: Already exists 
7c88599c0b25: Already exists 
25b5c6debdaf: Already exists 
43a5816f1617: Already exists 
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 删除镜像

docker rmi -f 镜像id		# 按照镜像id删除
docker rmi -f 镜像id 镜像id 镜像id	# 通过空格隔开可以同时删除多个镜像
docker rmi -f $(docker images -q)	# 直接查询所有镜像id删除所有镜像
此外,也可以通过镜像名删除,一般通过镜像id删除

容器命令

说明:有了镜像才可以创建容器,linux,下载一个centOS镜像进行学习

docker pull centos

新建容器并启动

docker run [可选参数] image

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

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

# 从容器中退回主机
[root@7f3508517c41 /]# exit
exit
[root@izbp18quije14hodxrcq6rz ~]# ls /
bin  boot  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  patch  proc  root  run  sbin  srv  sys  tmp  usr  var  www

列出所有运行中的容器

docker ps
		# 列出当前正在运行的容器
-a		# 列出当前正在运行的容器+带出历史运行过的容器
-n=?	# 按个数显示最近创建的容器
-q		# 只显示容器的编号
[root@izbp18quije14hodxrcq6rz ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@izbp18quije14hodxrcq6rz ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
7f3508517c41   centos         "/bin/bash"   5 minutes ago    Exited (0) 2 minutes ago              goofy_nightingale
9c231446c156   bf756fb1ae65   "/hello"      46 minutes ago   Exited (0) 46 minutes ago             great_bell
f482b40eb8fe   bf756fb1ae65   "/hello"      23 hours ago     Exited (0) 23 hours ago               stoic_kirch
[root@izbp18quije14hodxrcq6rz ~]# docker ps -a -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
7f3508517c41   centos    "/bin/bash"   8 minutes ago   Exited (0) 5 minutes ago             goofy_nightingale
[root@izbp18quije14hodxrcq6rz ~]# docker ps -aq
7f3508517c41
9c231446c156
f482b40eb8fe

退出容器

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 镜像名

docker run -d centos
# 通过docker ps发现问题,后台启动的centos停止了

# 常见的坑,docker 容器使用后台运行,就必须要有前台进程,docker发现前台没有应用,就会自动停止后台了
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

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

# 自己编写一段shell脚本
docker run -d centos /bin/sh -c "while true; do echo dashuaibi; sleep 1;done"
[root@izbp18quije14hodxrcq6rz ~]# docker ps
CONTAINER ID   IMAGE
397810e44131   centos

# 显示日志
-tf				# 显示日志
--tail number	# 要显示的日志条数
docker logs	-tf --tail 10 397810e44131

查看容器中的进程信息

top
[root@izbp18quije14hodxrcq6rz ~]# docker top 397810e44131
UID    PID    	PPID    C    STIME     TTY      TIME             CMD
root   29590    29554   0    00:14     ?        00:00:00         /bin/sh -c while true... 
root   30547    29590   0    00:20     ?        00:00:00         /usr/bin/coreutils...

查看镜像的元数据

docker inspect 容器id

[root@izbp18quije14hodxrcq6rz ~]# docker inspect 397810e44131
[
    # ...具体信息自行查看...
]

进入当前正在运行的容器

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

# 命令
# 方式1
docker exec -it 容器id bashshell
[root@izbp18quije14hodxrcq6rz ~]# docker exec -it 397810e44131 /bin/bash
[root@397810e44131 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 16:14 ?        00:00:00 /bin/sh -c while true; do echo dashuaibi; sleep 1;done
root       789     0  0 16:28 pts/0    00:00:00 /bin/bash
root       812     1  0 16:28 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       813   789  0 16:28 pts/0    00:00:00 ps -ef

# 方式2
docker attach 容器id
# 测试
[root@izbp18quije14hodxrcq6rz ~]# docker attach 397810e44131
正在执行当前容器代码...

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

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

docker cp 容器id:容器内路径	目的地主机路径

# 测试
# 进入docker容器内部
[root@izbp18quije14hodxrcq6rz zhangtong]# docker attach 39599f4029b9
# 在home目录创建test.java
[root@39599f4029b9 home]# touch /home/test.java
# exit 退出容器
[root@39599f4029b9 home]# exit
# 在主机执行复制操作
[root@izbp18quije14hodxrcq6rz zhangtong]# docker cp 39599f4029b9:/home/test.java /home
# 进入home目录查看文件是否存在
[root@izbp18quije14hodxrcq6rz zhangtong]# cd /home
[root@izbp18quije14hodxrcq6rz home]# ls
test.java
# 成功复制test.java到home目录

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

小结

常用命令

4. 练习

1. nginx安装

# 1. 搜索镜像,nginx
docker search nginx	# 或者去docker搜索
# 2. 拉取镜像
docker pull nginx
# 3. 启动nginx
# 后台运行nginx,起名nginx01 开放端口3500,映射服务器内部80端口
docker run -d --name nginx01 -p 3500:80 nginx
# 4. 查询容器
docker ps
# 5. 运行测试
curl localhost:3500	# 回显welcome to nginx

端口解析

思考问题:每次改动nginx配置文件,都必须进入容器内部吗?

要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?

-v 数据卷方式

2. tomcat安装

# 官方的使用
docker run -it --rm tomcat:9.0

# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到
docker run -it --rm tomcat:9.0  容器停止运行后会删除容器

# 按照我们的逻辑,先下载在启动
docker pull tomcat:9.0

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

# 测试访问没问题,但是404

# 进入容器
docker exec -it tomcat01 /bin/bash

# 发现问题:1. linux命令少了;2.没有webapps 
# 原因:阿里云镜像的原因,默认是最小的镜像,所有不必要的东西都被剔除
# 保证最小可运行的环境

思考问题:以后要部署项目,如果每次都要进入容器是不是十分麻烦?

要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了

如果删除docker,tomcat就没了? 如果以后部署mysql呢,删了docker,mysql的内容也没了?删库跑路?

3. 部署ES+Kibana

# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置在安全目录,挂载

# 下载启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 启动了 linux就卡住了
docker stats	# 查看cpu的状态

# 重启服务器

# 增加内存限制
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.6.2

内部容器的交互

5. docker 可视化

  • portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
  • rancher

什么是portainer?

docker图形化界面管理界面!提供一个后台面板供我们操作!

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试:ip:8088

6. 镜像相关

镜像是什么

镜像就是服务+环境打包的一个东西。

镜像加载原理

分层理解

commit镜像

docker commit	# 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名[:tag]

实战测试

# 启动一个默认的tomcat

# 发现这个tomcat的webapps里面没有内容,这是因为官方镜像默认的

# 我自己拷贝进去了内容

# 将操作过的容器通过commit提交为一个新的镜像,以后就可以使用修改后的镜像即可
docker commit -a="zhangtong" -m="add webapps app" bb4c006ed616 mytomcat:1.0

如果想保存当前容器的状态,就可以通过 commit来提交,获得一个镜像

猜你喜欢

转载自blog.csdn.net/qq_38557583/article/details/115293646