先给大家几个学习Docker网站:
Docker官网:www.docker.com
Docker中文网站:www.docker-cn.com
Docker Hub官网:hub.docker.com (仓库)
Docker安装
一. 环境说明
我们使用的是 CentOS 7 (64-bit) 目前,CentOS 仅发行版本中的内核支持 Docker。 Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
查看自己的系统内核
u-name -r
该命令用于打印当前系统的相关信息(内核版本号,硬件架构,主机名称和操作系统类型等)。
[root@jianyou /]# uname -r
3.10.0-1127.19.1.el7.x86_64
查看版本信息
cat /etc/os-release
[root@jianyou /]# 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、官网安装参考手册:docs.docker.com/engine/inst…
2、确定你是CentOS7及以上版本,我们已经做过了
3、yum安装gcc相关环境(提前需要确保虚拟机可以上外网 )
yum -y install gcc
yum -y install gcc-c++
- 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
5.安装需要的软件包
yum install -y yum-utils
- 设置镜像仓库
# 错误
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
# 正确
推荐使用国内的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
7.更新yum软件包索引
yum makecache fast
8.安装 Docker CE
yum install docker-ce docker-ce-cli containerd.io
- 启动Docker
systemctl start docker
10.测试命令
docker version //查看当前docker的版本
docker run hello-world //运行hello-world镜像
docker images //列出docker中所有的镜像
- 卸载
systemctl stop docker //停止docker运行
yum -y remove docker-ce docker-ce-cli containerd.io //删除docker安装包
rm -rf /var/lib/docker //删除docker所在目录
三. 使用阿里云镜像加速
1、介绍:www.aliyun.com/product/acr
2、注册一个属于自己的阿里云账户(可复用淘宝账号)
3、进入管理控制台设置密码,开通
4、查看镜像加速器自己的
5. 配置镜像加速
sudo mkdir -p /etc/docker //1.
sudo tee /etc/docker/daemon.json <<-'EOF' //2.
{
"registry-mirrors": ["https://p9kvs31t.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload //3.
sudo systemctl restart docker //4.
测试 hello-world
- 启动hello-world
docker run hello-world
- run之后,发生了什么?
Docker常用命令
1. 帮助命令
docker version //显示docker版本信息
docker info // 显示docker系统信息,包括镜像和容器数
docker --help //显示帮助
2.镜像命令
查看所有镜像
//结果如下==================
[root@jianyou /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 710ec5c56683 2 days ago 668MB
nginx latest 08b152afcfae 2 weeks ago 133MB
portainer/portainer latest 580c0e4e98b0 4 months ago 79.1MB
hello-world latest d1165f221234 5 months ago 13.3kB
centos latest 300e315adb2f 8 months ago 209MB
rancher/server latest 98d8bb571885 15 months ago 1.08GB
rancher/agent v1.2.11 1cc7591af4f5 3 years ago 243MB
## 解释
REPOSITORY 镜像的名字
TAG 镜像的标签
IMAGE ID 镜像的唯一ID
CREATED 镜像的创建时间
SIZE 镜像所占的大小
# 同一个仓库源可以有多个TAG,代表这个仓库源的不同版本,我们使用repository:tag定义不同的镜像,如果我们不自己定义镜像的标签版本,docker将使用默认的lastest镜像!
docker images [可选参数]
# 命令可选项
-a 列出本地所有镜像
-q 只显示镜像的id
--digests 显示镜像的摘要消息
搜索某个镜像
从DockerHub仓库中搜索镜像
[root@jianyou /]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15284 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2057 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 815 [OK]
# docker search 某个镜像的名称 对应DockerHub仓库中的镜像
# 可选项
--filter=stars=50 : 列出收藏数不小于指定值的镜像。
下载某个镜像
下载镜像
[root@jianyou /]# docker pull redis
Using default tag: latest # 不写tag(版本)的话,默认是latest,最新的。
latest: Pulling from library/redis
33847f680f63: Already exists #分层下载
26a746039521: Pulling fs layer
18d87da94363: Pulling fs layer
5e118a708802: Pulling fs layer
ecf0dbe7c357: Waiting
46f280ba52da: Waiting
删除镜像
删除镜像
docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个
docker rmi -f $(docker images -qa) # 删除全部
3. 容器命令
说明:
有镜像才能创建容器,我们这里使用centos的镜像来进行测试,就是虚拟化一个centos!
docker pull centos
新建容器并启动
# 命令
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
docker run -d -it -p 8888:80 --net bridge --name tomcat01 tomcat
# 常用参数说明
--name="Name" # 给容器指定一个名字
-d # 后台方式运行容器,并返回容器的id!
-i # 以交互模式运行容器,通过和 -t 一起使用
-t # 给容器重新分配一个终端,通常和 -i 一起使用
-P # 随机端口映射(大写)
-p # 指定端口映射(小写),
-v #数据卷映射
-net #设置网络连接模式
一般可以有四种写法
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort (常用)
containerPort
#测试
[root@jianyou /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 710ec5c56683 2 days ago 668MB
redis latest aa4d65e670d6 2 weeks ago 105MB
nginx latest 08b152afcfae 2 weeks ago 133MB
portainer/portainer latest 580c0e4e98b0 4 months ago 79.1MB
hello-world latest d1165f221234 5 months ago 13.3kB
centos latest 300e315adb2f 8 months ago 209MB
rancher/server latest 98d8bb571885 15 months ago 1.08GB
rancher/agent v1.2.11 1cc7591af4f5 3 years ago 243MB
# 用交互模式来启动centos容器,在容器内执行/bin/bash命令!
[root@jianyou /]# docker run --name="mycentos" -d -it centos /bin/bash
605e63a044bb943e8f7bf2f4ad3ddc02fec9040087330af6ad6e29f82b5bab0e
若出现这一串,代表centos运行成功!
刚刚是以后台形式进入的,现在我们不以后台形式运行
[root@jianyou /]# docker run --name="mycentos02" -it centos /bin/bash
[root@9bbd00c72f6f /]# #注意主机名已经改变了!说明已经进入到centos中
# 退出
exit # 容器停止退出
ctrl+P+Q # 容器不停止退出
启动/停止容器
docker start (容器id or 容器名) # 启动容器
docker restart (容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器
docker kill (容器id or 容器名) # 强制停止容器
删除容器
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -a -q) # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器
查看日志
docker logs -f -t --tail 容器id
查看所有运行中的容器
docker ps
查看容器中运行的进程信息,支持ps参数
[root@jianyou /]# docker ps //先列出所有运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e63a044bb centos "/bin/bash" 16 hours ago Up 16 hours mycentos
8ad9f258cbab portainer/portainer "/portainer" 18 hours ago Up 17 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp naughty_hamilton
[root@jianyou /]# docker top 605e63a044bb //查看centos容器运行的进程信息
UID PID PPID C STIME TTY TIME CMD
root 27276 27257 0 Aug09 pts/0 00:00:00 /bin/bash
查看容器、镜像的元数据
docker inspect 容器id
[root@jianyou /]# docker inspect 605e63a044bb
[
{
"Id": "605e63a044bb943e8f7bf2f4ad3ddc02fec9040087330af6ad6e29f82b5bab0e",
"Created": "2021-08-09T10:01:31.469732325Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 27276,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-08-09T10:01:31.896550068Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/605e63a044bb943e8f7bf2f4ad3ddc02fec9040087330af6ad6e29f82b5bab0e/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/605e63a044bb943e8f7bf2f4ad3ddc02fec9040087330af6ad6e29f82b5bab0e/hostname",
"HostsPath": "/var/lib/docker/containers/605e63a044bb943e8f7bf2f4ad3ddc02fec9040087330af6ad6e29f82b5bab0e/hosts",
"LogPath": "/var/lib/docker/containers/605e63a044bb943e8f7bf2f4ad3ddc02fec9040087330af6ad6e29f82b5bab0e/605e63a044bb943e8f7bf2f4ad3ddc02fec9040087330af6ad6e29f82b5bab0e-json.log",
xxxxxxxxxxx.................
进入正在运行的容器
#命令1
docker exec -it 容器id bashShell //以交互模式运行容器
#测试1
[root@jianyou /]# docker ps //列出所有运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e63a044bb centos "/bin/bash" 16 hours ago Up 16 hours mycentos
8ad9f258cbab portainer/portainer "/portainer" 18 hours ago Up 17 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp naughty_hamilton
[root@jianyou /]# docker exec -it 605e63a044bb /bin/bash //(以新开启一个终端的形式)进入容器中
[root@605e63a044bb /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug09 pts/0 00:00:00 /bin/bash
root 30 1 0 01:46 pts/0 00:00:00 ps -ef
#命令2
docker attach 容器id
#测试2
[root@jianyou /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e63a044bb centos "/bin/bash" 16 hours ago Up 16 hours mycentos
8ad9f258cbab portainer/portainer "/portainer" 18 hours ago Up 17 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp naughty_hamilton
[root@jianyou /]# docker attach 605e63a044bb //(直接进入容器启动命令的终端,不会启动新的进程)进入容器中
[root@605e63a044bb /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug09 pts/0 00:00:00 /bin/bash
root 30 1 0 01:46 pts/0 00:00:00 ps -ef
从容器内拷贝文件到主机
docker cp 容器id:容器内路径 目的主机路径
# 测试
# 容器内执行,创建一个文件测试
[root@605e63a044bb /]# cd /home //进入到容器中的home目录
[root@605e63a044bb home]# ls
[root@605e63a044bb home]# touch jianyou.java //在容器中新建一个java文件
[root@605e63a044bb home]# ls
jianyou.java
[root@605e63a044bb home]# exit //退出容器【ctrl+p+q也能退出】
[root@jianyou /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e63a044bb centos "/bin/bash" 16 hours ago Up 16 hours mycentos
8ad9f258cbab portainer/portainer "/portainer" 18 hours ago Up 17 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp naughty_hamilton
[root@jianyou /]# docker cp 605e63a044bb:/home/jianyou.java /home
[root@jianyou /]# cd home
[root@jianyou home]# ls
jianyou.java www xinyou //可以看到,已经复制成功了!
[root@jianyou home]#
容器数据卷
数据挂载
使用数据卷
方式一:在容器中直接使用命令来添加 挂载
# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
# 测试
[root@jianyou dockerfile]# docker run -it -v /home/ceshi:/home centos /bin/bash
查看数据卷是否挂载成功
docker inspect 容器id
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
可以非常明显的看到,已经挂载成功了!
接下来,我们分别进入到宿主机和docker容器中的对应目录,测试数据共享发现,已经成功了!
[root@jianyou home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=2559 --name mysql01 mysql:5.7
039df7f3e8e2eeab38620292e96216cd45ee0fe5985515fcc01826231116910e
[root@jianyou home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
039df7f3e8e2 mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp mysql01
04203c3c0b33 centos "/bin/bash" 14 minutes ago Up 12 minutes centos222
[root@jianyou home]#
Dockerfile文件配置
什么是dockerfile?
dockerfile就是一种构建docker镜像的文本文件!可以通过一系列的命令构成的一个脚本文件。
实例
dockerfile打包java项目镜像
FROM java:8
MAINTAINER jianyou<sdj@qq.com>
# 将同目录下的.jar文件引入到容器中,并更名为app.jar
COPY *.jar app.jar
#修改这个文件的访问时间和修改时间为当前时间,而不会修改文件的内容。
EXPOSE 8080 # 不建议在这里设置,应该容器运行时手动设置
WORKDIR "" # 指定容器运行时的工作目录
RUN ["",""] # 在创建镜像的时候运行的命令
CMD ["","",""] # 运行容器时自动执行的命令,只能执行一个命令,后面的命令会覆盖掉前面的命令。
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=dev", "--server.port=8080", "> /log/app.log"] # 运行容器时会自动执行的命令,可以执行多个命令,不会覆盖。
将镜像上传至dockerHub
-
检查是否登录,必须登录到dockerhub。
docker login
检查是否登录
docker login -u username
登录命令 -
将打包好的镜像改名字(不改名字无法push)
docker tag 改前的名字 dokcerhub仓库名/改后的名字
-
push到dockerhub
docker push dokcerhub仓库名/改后的名字
Docker网络连接
查看本机ip
[root@jianyou /]# ip addr //查看本机的ip
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:b3:32:e5 brd ff:ff:ff:ff:ff:ff
inet 172.21.0.17/20 brd 172.21.15.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:feb3:32e5/64 scope link
valid_lft forever preferred_lft forever
//docker0就是我们安装了docker以后会出现,它采用的是桥接方式来和主机连接的。
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:d1:9d:5a:14 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d1ff:fe9d:5a14/64 scope link
valid_lft forever preferred_lft forever
自定义网络
创建一个自定义网络
// 在driver后面跟一种桥接的方式,子网和网关可以随便设置
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker exec -it tomcat01 ip addr 直接进入容器并执行命令
查看网络的具体信息
docker network ls //查看所有网络信息
docker network inspect 网络id(或者名字) //查看一个网络具体信息
将一个容器加入到网络中(让它们可以互相ping)
docker network connect mynet tomcat01 //将一个容器连接到一个网络中,使其可以互相访问 mynet 网络名 tomcat01 容器名字