Docker
常用资源网站
- Docker官网:https://www.docker.com/
- Docker官方文档:https://docs.docker.com/
安装
以Centos为例:
卸载旧版本(如果无可跳过)
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
安装
配置安装仓库
sudo yum install -y yum-utils #下方可使用国内的镜像,实际测试时官方较快,故不作更改 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
开始下载安装
sudo yum install docker-ce docker-ce-cli containerd.io
启动docker服务
sudo systemctl start docker
运行测试,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
- 进入阿里云《容器镜像服务》
- 下面选择镜像工具
- 找到镜像加速器
- 按照教程配置即可
## 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
# 这里的每个命令,就是镜像的一层
基础知识
- 每个保留关键字(指令)都是必须是大写字母
- 执行顺序从上到下顺序执行
表示注释
- 每个命令都会创建提交一个新的镜像层,并提交
- dockerfile是面向开发的,发布项目,就需要编写dockerfile文件
Docker:
- DockerFile:构建文件,定义一切步骤,源代码
- DockerImages: 通过dockerFile构建生成的镜像,最终发布和运行的产品
- docker容器:容器就是镜像运行起来的提供服务的
- Docker Hub 中 99%镜像都是从这个基础镜像的FROM scrath,然后配置需要的软件和配置来
构建步骤
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- 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
此处评论已关闭