Docker安装及基本命令速查手册

896 阅读11分钟

先给大家几个学习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++
  1. 卸载旧版本
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
  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 
# 正确
推荐使用国内的
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
  1. 启动Docker
systemctl start docker

10.测试命令

docker  version   //查看当前docker的版本

docker run hello-world      //运行hello-world镜像

docker images         //列出docker中所有的镜像
  1. 卸载
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、查看镜像加速器自己的

image.png 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

  1. 启动hello-world
docker run hello-world
  1. run之后,发生了什么?

image.png

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容器中的对应目录,测试数据共享发现,已经成功了! image.png

[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"] # 运行容器时会自动执行的命令,可以执行多个命令,不会覆盖。

image.png

将镜像上传至dockerHub

  1. 检查是否登录,必须登录到dockerhub。 docker login 检查是否登录
    docker login -u username 登录命令

  2. 将打包好的镜像改名字(不改名字无法push)
    docker tag 改前的名字 dokcerhub仓库名/改后的名字

  3. 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 容器名字