Docker基本操作笔记

本文详细介绍了如何在CentOS上安装Docker,包括卸载旧版本、配置仓库、安装过程,以及Docker的基本使用,如镜像操作、容器启动、删除和管理。重点突出了Docker与虚拟机速度上的优势和命令行实用技巧。
摘要由CSDN通过智能技术生成

Docker

来自自己建的博客:http://blog.mc10010.com

常用资源网站

  1. Docker官网:https://www.docker.com/
  2. Docker官方文档:https://docs.docker.com/

安装

参考地址:https://docs.docker.com/engine/install/

以Centos为例:

  1. 卸载旧版本(如果无可跳过)

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 安装

    1. 配置安装仓库

      sudo yum install -y yum-utils
       #下方可使用国内的镜像,实际测试时官方较快,故不作更改
      sudo yum-config-manager \
          --add-repo \
          https://download.docker.com/linux/centos/docker-ce.repo
      
    2. 开始下载安装

      sudo yum install docker-ce docker-ce-cli containerd.io
      
  3. 启动docker服务

    sudo systemctl start docker
    
  4. 运行测试,HelloWorld

    sudo docker run hello-world
    
    [root@iZ2zeg016prgcnynm3v4z7Z ~]# sudo docker run hello-world
    Unable to find image 'hello-world:latest' locally #第一次本地找不到镜像
    latest: Pulling from library/hello-world #开始在远程拉取
    b8dfde127a29: Pull complete 
    Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
    Status: Downloaded newer image for hello-world:latest
    # 输出hello,表示成功
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    

    另注:卸载docker

    sudo yum remove docker-ce docker-ce-cli containerd.io #卸载核心, CLI, and Containerd
    # 删除delete all images, containers, and volumes
    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd
    # 注意:必须手动删除所有已编辑的配置文件
    
    配置阿里云镜像加速

    Ubuntu 14.04 16.04 (使用doapt-get进行安装)

    # step 1: 安装必要的一些系统工具
    sudo apt-get update
    sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
    # step 2: 安装GPG证书
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    # Step 3: 写入软件源信息
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    # Step 4: 更新并安装 Docker-CE
    sudo apt-get -y update
    sudo apt-get -y install docker-ce
    
    1. 进入阿里云《容器镜像服务》
    2. 下面选择镜像工具
    3. 找到镜像加速器
    4. 按照教程配置即可

    Docker为什么比vm快

    • Docker有着更少的抽象层,虚拟机需要将硬件进行虚拟化,但是Docker直接使用的是物理机的硬件资源,因此占用更少
    • Docker利用的是HostOS(宿主机内核),不需要GuestOS(虚拟机内核)避免了引导,加载操作系统的耗时过程

Docker命令

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

​ 参考文档:https://docs.docker.com/engine/reference/run/

### 镜像命令
docker images 列出所有镜像
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
#仓库源       版本信息  镜像ID          镜像创建时间   镜像大小
hello-world   latest    d1165f221234   2 months ago   13.3kB
#可选项
-a      --all 	  #显示所有镜像
-q      --quiet	  #只显示ID
docker search 搜索镜像
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker search redis
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis                            Redis is an open source key-value store that…   9391      [OK]       
bitnami/redis                    Bitnami Redis Docker Image                      178                  [OK]
sameersbn/redis                                                                  82                   [OK]
grokzen/redis-cluster            Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2      78                   
rediscommander/redis-commander   Alpine image for redis-commander - Redis man…   57                   [OK]
#条件过滤
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker search redis --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis     Redis is an open source key-value store that…   9391      [OK]  
docker pull 下载镜像
# 下载镜像,默认下载最新版
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
f7ec5a41d630: Pull complete 
a36224ca8bbd: Pull complete 
7630ad34dcb2: Pull complete 
e74b2f747260: Pull complete 
ebc61c7bf222: Pull complete 
1aafd9c07208: Pull complete 
Digest: sha256:eff56acc5fc7b909183da93236ba09d3b8cb7d6db31d5b25e9a46dac9b5e699b
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
redis         latest    ccee4cdf984f   2 days ago     105MB
hello-world   latest    d1165f221234   2 months ago   13.3kB

# 下载指定版本的镜像
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker pull redis:6.0-buster
6.0-buster: Pulling from library/redis
f7ec5a41d630: Already exists 
a36224ca8bbd: Already exists 
7630ad34dcb2: Already exists 
b794377c17d4: Pull complete 
a134ee7a12b3: Pull complete 
ab302c2d25fc: Pull complete 
Digest: sha256:b8edf70fff42b773e8ba546dd8ecd0c4dec1ec95eb8df5fc6dbab156b66a3c5c
Status: Downloaded newer image for redis:6.0-buster
docker.io/library/redis:6.0-buster

[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker images
REPOSITORY    TAG          IMAGE ID       CREATED        SIZE
redis         6.0-buster   3038fc9615f1   2 days ago     104MB
redis         latest       ccee4cdf984f   2 days ago     105MB
hello-world   latest       d1165f221234   2 months ago   13.3kB
docker rmi 删除镜像
# 指定ID删除
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker rmi -f d1165f221234
Untagged: hello-world:latest
Untagged: hello-world@sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED      SIZE
redis        6.0-buster   3038fc9615f1   2 days ago   104MB
redis        latest       ccee4cdf984f   2 days ago   105MB
# 删除全部镜像
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED      SIZE
redis        6.0-buster   3038fc9615f1   2 days ago   104MB
redis        latest       ccee4cdf984f   2 days ago   105MB

[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker rmi -f $(docker images -aq)
Untagged: redis:6.0-buster
Untagged: redis@sha256:b8edf70fff42b773e8ba546dd8ecd0c4dec1ec95eb8df5fc6dbab156b66a3c5c
Deleted: sha256:3038fc9615f1041f2ca26373f773b375a0f4c521fed5061a27b3e5de3ce0d22b
Deleted: sha256:078677cde06355b908656714d9a75f12fbf024529546c5de468d47b5772f4663
Deleted: sha256:6df4d048e3f15a2f02229bd345352cb50fbe678ae6192f97b3951bd958d5d04e
Deleted: sha256:eb673ec2b3f6b87cd122f2e8b835ca6ce11d07292b45ee101a01e2620a3c5f14
Untagged: redis:latest
Untagged: redis@sha256:eff56acc5fc7b909183da93236ba09d3b8cb7d6db31d5b25e9a46dac9b5e699b
Deleted: sha256:ccee4cdf984f11952441cbab30146dae792c8d9fb668e762c78a49e7db858082
Deleted: sha256:a4f3d68d06ee9aec1862695818528930f0e889f5c892da8be4c06759dc2e8f86
Deleted: sha256:02c22c39334cefb22054330d3be804a3046286d7f0a47d83f5f25be13f4e635e
Deleted: sha256:2d01997f1c500789fc369f5440ea810257641af6fbb1d4eaeb9558d94ea8879d
Deleted: sha256:f448a5cc1367794bb2f15d887438c8b43f2324ee3523f5d95c15997685cc816d
Deleted: sha256:e481db33c0c73ee7de5ecda57c21fcfb7eeeff7d22fcc4ad0166b0bf64a63a32
Deleted: sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d

[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
# 删除多个docker镜像
docker rmi -f 镜像ID 镜像ID 镜像ID

容器命令

新建容器并启动
docker run [可选参数] 镜像名
# 参数说明
--name="Name"    # 指定容器名字
-d				# 后台方式运行
-it 			# 使用交互方式运行,进入容器查看内容
-p				# 指定容器端口 例如 -p 8080:8080
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口 (常用)
	-p 容器端口
-P 				#随机指定端口
-e  			# 环境设置
退出容器
# 退出容器并关闭
exit 
# 退出不关闭容器
ctrl + p + q
查询容器
# 查看正在运行的容器
docker ps
			#列出正在运行的容器
	-a 		# 列出正在运行的+历史运行过的容器
	-n=		#显示最近创建的容器,等号后面筛选条数
	-q		#只显示容器编号



 #mysql部署示例
 [root@iZ2zeg016prgcnynm3v4z7Z ~]# docker run -itd --name mysqlTest123 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
 23641db526fc8bbe0b4594881f4f662ab8868cddf16a82f41eff73e155a41003
 [root@iZ2zeg016prgcnynm3v4z7Z ~]# docker ps
 CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
 23641db526fc   mysql     "docker-entrypoint.s…"   3 seconds ago   Up 3 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysqlTest123
 
删除容器
docker rm 容器ID 						# 删除指定容器docker rm -f $(docker ps -aq) 		  # 删除所有容器
启动和停止容器
docker start 容器ID 		# 启动容器docker restart 容器ID		# 重启容器docker stop 容器ID		# 停止当前正在运行的容器docker kill 容器ID		# 强制停止当前容器

后台运行的应用如果没有前台进程,docker没有发现应用,就会自动停止

查看日志
docker log
[root@iZ2zeg016prgcnynm3v4z7Z ~]# 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)
查看容器中进程信息
# docker top 容器ID     查看进程
[root@iZ2zeg016prgcnynm3v4z7Z ~]# docker top 23641db526fc
UID                 PID                 PPID                C                   STIME               TTY   
polkitd             16463               16443               0                   17:03               pts/0
进入容器
# docker exec 容器ID   进入容器后开启一个新的终端,可以在里面操作(常用)docker exec -it 23641db526fc /bin/bash   #以控制台方式进入ID为23641db526fc的镜像
#docker attach #进入容器正在执行的终端,不好启动新进程
拷贝文件
docker cp 容器ID 拷贝位置 拷贝到## 其他
commit镜像
docker commit 提交容器成为一个新的副本,保持当前容器状态#例如docker commit -m="提交的描述信息 -a"作者" 容器ID 目标镜像名字:[TAG]
使用数据卷
docker run -it -v /home/ceshi:/home centos /bin/bash  # 将主机下的ceshi绑定到容器内的/home 
# 匿名挂载
docker run -d --name nginx01 -v /etc/nginx/ nginx

# 查看所有的卷
docker volume ls
# 这里发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器外的路径

# 具名挂载
docker run -d --name nginx01 -v 名字:/etc/nginx/ nginx

扩展:

# 通过 -v 容器内路径:ro rw 改变读写权限
# ro readonly  # 只读
# rw readwrite # 可读可写

# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d --name nginx01 -v 名字:/etc/nginx/:ro nginx
docker run -d --name nginx01 -v 名字:/etc/nginx/:rw nginx

# 看到ro说明,说明这个路径只能通过宿主机操作,容器内部无法操作
父容器和子容器
docker run -it --name docker02 --volumes-from docker01 kuangshen/centos:1.0
# volumes-from 父容器

tips:当删除docker01时候,docker02中的文件依然存在,起到备份的作用,容器之间配置信息的传递,数据卷容器的生命周期一直持续到没用容器使用为止,但是一旦你持久化到了本地,这个时候,本地数据不会删除

DockerFile

Dockerfile 就是用来构建docker镜像的命令参数脚本!

通过这个脚本可以生成镜像,镜像是一层一层的,脚本命令是一个个的,每个命令是一层

FROM centos

VOLUME["volume01","volume02"]

CMD echo "-----end------"

CMD /bin/bash

# 这里的每个命令,就是镜像的一层
基础知识
  1. 每个保留关键字(指令)都是必须是大写字母

  2. 执行顺序从上到下顺序执行

  3. #表示注释

  4. 每个命令都会创建提交一个新的镜像层,并提交

  5. dockerfile是面向开发的,发布项目,就需要编写dockerfile文件

  6. Docker:

    • DockerFile:构建文件,定义一切步骤,源代码

    • DockerImages: 通过dockerFile构建生成的镜像,最终发布和运行的产品

    • docker容器:容器就是镜像运行起来的提供服务的

  7. Docker Hub 中 99%镜像都是从这个基础镜像的FROM scrath,然后配置需要的软件和配置来

构建步骤

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

DockerFile命令

FROM		# 基础镜像,一切从这里开始构建
MAINTARNER   # 镜像是谁写的,姓名+邮箱
RUN 		# 镜像docker build构建的时候需要运行的命令
ADD 		# 步骤,tomcat镜像,这个tomcat压缩包!添加的内容
WORKDIR		# 镜像的工作目录
VOLUME 		# 挂载的目录
EXPOSE 		# 指定工作端口
CMD			# 指定这个容器docker run 时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	# 指定这个容器启动的时候要运行的命令,可以追究追加命令
ONBUILD		# 当构建一个被集成DockerFile 这个时候就会运行ONBUILD 命令,出发命令
COPY 		# 类似ADD,将我们文件拷贝到镜像中
ENV			# 构建的时候设置环境变量

创建自己的Centos

# 1 编写Dockerfile的文件
[root@instance-mld33vg0]: vim docker-file 
FROM centos
MAINTAINER YuKanJiu<123@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
# 构建docker镜像
docker build -f docker-file . -t mycentos:0.1
	-f 镜像输出路径
	-t 镜像的名字:版本
root@instance-mld33vg0:/home/docker-test# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
mycentos      0.1       8752032611e9   25 minutes ago   291MB
  • docker history ID 可以查看镜像是怎么构建的
CMD与ENTRYPOINT区别
# 测试cmd
root@instance-mld33vg0:/home/docker-test# cat cmdtest 
FROM centos
CMD ["ls","-a"]
# 构建cmdtest
root@instance-mld33vg0:/home/docker-test# docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 想追加一个 -l 命令 即ls -al
root@instance-mld33vg0:/home/docker-test# docker run cmdtest -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
# cmd的情形下-l 替换了CMD ["ls","-a"]命令,-l不是命令,所以报错
root@instance-mld33vg0:/home/docker-test# docker run cmdtest ls -al
total 56
drwxr-xr-x   1 root root 4096 May 20 14:07 .
drwxr-xr-x   1 root root 4096 May 20 14:07 ..
-rwxr-xr-x   1 root root    0 May 20 14:07 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 20 14:07 dev
drwxr-xr-x   1 root root 4096 May 20 14:07 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 146 root root    0 May 20 14:07 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 May 20 14:07 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var

​~~~shell
# 测试entrypoint
root@instance-mld33vg0:/home/docker-test# cat cmdtest 
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建
root@instance-mld33vg0:/home/docker-test# docker build -f cmdtest -t entrypoint-test .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in e45517476a1a
Removing intermediate container e45517476a1a
 ---> 6f4d38f1ff9d
Successfully built 6f4d38f1ff9d
Successfully tagged entrypoint-test:latest

# 测试
root@instance-mld33vg0:/home/docker-test# docker run entrypoint-test -l
total 56
drwxr-xr-x   1 root root 4096 May 20 14:10 .
drwxr-xr-x   1 root root 4096 May 20 14:10 ..
-rwxr-xr-x   1 root root    0 May 20 14:10 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 20 14:10 dev
drwxr-xr-x   1 root root 4096 May 20 14:10 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 150 root root    0 May 20 14:10 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 May 20 14:07 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var
# 可以看到我们追加的命令,是直接拼接在entrypoint后面的

发布镜像

登录

docker login -u user

推送镜像

docker push 发布者/名字:tag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值