docker命令基本使用

1、docker进程相关命令

  • 启动docker服务

    systemctl start docker 
    
  • 停止docker服务

     systemctl stop docker 
    
  • 重启docker服务

    systemctl restart docker
    
  • 查看docker服务状态

    systemctl status docker
    
  • 设置开机启动docker服务

     systemctl enable docker
    

2、docker镜像相关命令

  • 查看docker镜像

    • 查看镜像: 查看本地所有的镜像

      [root@localhost ~]# docker  images
      镜像名称	  版本号    镜像ID		 镜像存在时间    镜像大小
      REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
      centos       latest    5d0da3dc9764   2 years ago   231MB
      [root@localhost ~]# docker   images -q    #查看所有的镜像ID
      5d0da3dc9764
      
  • 搜索镜像:从网络中查找需要的镜像

    docker search 镜像名称
    NAME:镜像的名称
    DESCRIPTION:镜像的描述
    STARS:镜像的大小
    OFFICIAL:镜像是否是官方维护  如果至位【ok】则代表,该镜像是官方维护的镜像
    注意:如果需要查看镜像的版本号,则需要到https://hub.docker.com的docker镜像仓库官方网站中去查看
    
    [root@localhost ~]# docker  search   nginx
    NAME                               DESCRIPTION                                      STARS     OFFICIAL
    nginx                              Official build of Nginx.                         19730     [OK]
    unit                               Official build of NGINX Unit: Universal Web …   25        [OK]
    nginx/nginx-ingress                NGINX and  NGINX Plus Ingress Controllers fo…   89
    nginxinc/nginx-unprivileged        Unprivileged NGINX Dockerfiles                   144
    nginx/nginx-prometheus-exporter    NGINX Prometheus Exporter for NGINX and NGIN…   39
    nginxinc/nginx-s3-gateway          Authenticating and caching gateway based on …   6
    nginx/unit                         This repository is retired, use the Docker o…   64
    nginx/nginx-ingress-operator       NGINX Ingress Operator for NGINX and NGINX P…   2
    nginxinc/amplify-agent             NGINX Amplify Agent docker repository            1
    nginx/nginx-quic-qns               NGINX QUIC interop                               1
    nginxinc/ingress-demo              Ingress Demo                                     4
    nginxproxy/nginx-proxy             Automated nginx proxy for Docker containers …   132
    nginxproxy/acme-companion          Automated ACME SSL certificate generation fo…   131
    bitnami/nginx                      Bitnami nginx Docker Image                       184
    bitnami/nginx-ingress-controller   Bitnami Docker Image for NGINX Ingress Contr…   32
    ubuntu/nginx                       Nginx, a high-performance reverse proxy & we…   112
    nginxinc/nginmesh_proxy_debug                                                       0
    nginxproxy/docker-gen              Generate files from docker container meta-da…   16
    nginxinc/mra-fakes3                                                                 0
    kasmweb/nginx                      An Nginx image based off nginx:alpine and in…   7
    nginxinc/nginmesh_proxy_init                                                        0
    nginxinc/mra_python_base                                                            0
    nginxinc/ngx-rust-tool                                                              0
    rancher/nginx-ingress-controller                                                    12
    
  • 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本。 如果不知道镜像版本,可以去docker hub搜索对应镜像查看

docker pull 镜像名称
[root@localhost ~]# docker pull  centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

[root@localhost ~]# docker  images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   2 years ago   231MB

  • 删除镜像

    docker rmi 镜像id # 删除指定本地镜像
    docker rmi `docker images -q` # 删除所有本地镜
    
    

3、docker容器相关命令

  • 查看容器

    docker ps # 查看正在运行的容器
    docker ps –a # 查看所有容器
    
    
  • 创建并启动容器

    docker run 参数
    参数说明:
    	•-i:保持容器运行。通常与-t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
    	•-t:为容器重新分配一个伪输入终端,通常与-i 同时使用。
    	•-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用dockerexec 进入容器。退出后,容器不会关闭。
    	•-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
    	•--name:为创建的容器命名
    
    使用-it的方式创建的容器,在退出容器之后,容器就自己关闭了,可以使用docker  ps  -a查看
    [root@localhost ~]# docker  run  -it  --name=c1   centos  /bin/bash   
    [root@032584224b03 /]#
    [root@032584224b03 /]# exit
    exit
    [root@localhost ~]#
    [root@localhost ~]# docker  ps -a
    CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                          PORTS     NAMES
    032584224b03   centos    "/bin/bash"   2 minutes ago   Exited (0) About a minute ago             c1
    使用-id创建出来的容器,不会立即进入容器里面,退出的时候也不会停止容器
    [root@localhost ~]# docker  run  -id  --name=c2   centos
    1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714
    
    [root@localhost ~]# docker  ps  -a
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
    1fe4f0cb8c99   centos    "/bin/bash"   55 seconds ago   Up 54 seconds                        c2
    032584224b03   centos    "/bin/bash"   5 minutes ago    Exited (0) 3 minutes ago             c1
    
    
    
  • 进入容器

    [root@localhost ~]# docker  exec  -it c2  /bin/bash
    [root@1fe4f0cb8c99 /]#
    
  • 停止容器

    docker stop 容器名称
    
  • 启动容器

    docker start 容器名称
    
  • 删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除

    docker rm 容器名称
    
  • 查看容器信息

    docker inspect 容器名称
    [root@localhost ~]# docker  inspect  c2
    [
        {
            "Id": "1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714",
            "Created": "2024-03-25T12:21:19.607717435Z",
            "Path": "/bin/bash",
            "Args": [],
            "State": {
                "Status": "running",
                "Running": true,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 89946,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2024-03-25T12:21:19.749264293Z",
                "FinishedAt": "0001-01-01T00:00:00Z"
            },
            "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
            "ResolvConfPath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/resolv.conf",
            "HostnamePath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/hostname",
            "HostsPath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/hosts",
            "LogPath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714-json.log",
            "Name": "/c2",
            "RestartCount": 0,
            "Driver": "overlay2",
            "Platform": "linux",
            "MountLabel": "",
            "ProcessLabel": "",
            "AppArmorProfile": "",
            "ExecIDs": null,
            "HostConfig": {
                "Binds": null,
                "ContainerIDFile": "",
                "LogConfig": {
                    "Type": "json-file",
                    "Config": {}
                },
                "NetworkMode": "default",
                "PortBindings": {},
                "RestartPolicy": {
                    "Name": "no",
                    "MaximumRetryCount": 0
                },
                "AutoRemove": false,
                "VolumeDriver": "",
                "VolumesFrom": null,
                "ConsoleSize": [
                    43,
                    154
                ],
                "CapAdd": null,
                "CapDrop": null,
                "CgroupnsMode": "host",
                "Dns": [],
                "DnsOptions": [],
                "DnsSearch": [],
                "ExtraHosts": null,
                "GroupAdd": null,
                "IpcMode": "private",
                "Cgroup": "",
                "Links": null,
                "OomScoreAdj": 0,
                "PidMode": "",
                "Privileged": false,
                "PublishAllPorts": false,
                "ReadonlyRootfs": false,
                "SecurityOpt": null,
                "UTSMode": "",
                "UsernsMode": "",
                "ShmSize": 67108864,
                "Runtime": "runc",
                "Isolation": "",
                "CpuShares": 0,
                "Memory": 0,
                "NanoCpus": 0,
                "CgroupParent": "",
                "BlkioWeight": 0,
                "BlkioWeightDevice": [],
                "BlkioDeviceReadBps": [],
                "BlkioDeviceWriteBps": [],
                "BlkioDeviceReadIOps": [],
                "BlkioDeviceWriteIOps": [],
                "CpuPeriod": 0,
                "CpuQuota": 0,
                "CpuRealtimePeriod": 0,
                "CpuRealtimeRuntime": 0,
                "CpusetCpus": "",
                "CpusetMems": "",
                "Devices": [],
                "DeviceCgroupRules": null,
                "DeviceRequests": null,
                "MemoryReservation": 0,
                "MemorySwap": 0,
                "MemorySwappiness": null,
                "OomKillDisable": false,
                "PidsLimit": null,
                "Ulimits": [],
                "CpuCount": 0,
                "CpuPercent": 0,
                "IOMaximumIOps": 0,
                "IOMaximumBandwidth": 0,
                "MaskedPaths": [
                    "/proc/asound",
                    "/proc/acpi",
                    "/proc/kcore",
                    "/proc/keys",
                    "/proc/latency_stats",
                    "/proc/timer_list",
                    "/proc/timer_stats",
                    "/proc/sched_debug",
                    "/proc/scsi",
                    "/sys/firmware",
                    "/sys/devices/virtual/powercap"
                ],
                "ReadonlyPaths": [
                    "/proc/bus",
                    "/proc/fs",
                    "/proc/irq",
                    "/proc/sys",
                    "/proc/sysrq-trigger"
                ]
            },
            "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024-init/diff:/var/lib/docker/overlay2/9c386ad386c9a38d4fbff70d2adbca13527127609dd7bd8a0f4d3fd55c6a74d9/diff",
                    "MergedDir": "/var/lib/docker/overlay2/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024/merged",
                    "UpperDir": "/var/lib/docker/overlay2/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024/diff",
                    "WorkDir": "/var/lib/docker/overlay2/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024/work"
                },
                "Name": "overlay2"
            },
            "Mounts": [],
            "Config": {
                "Hostname": "1fe4f0cb8c99",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "Tty": false,
                "OpenStdin": true,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ],
                "Cmd": [
                    "/bin/bash"
                ],
                "Image": "centos",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {
                    "org.label-schema.build-date": "20210915",
                    "org.label-schema.license": "GPLv2",
                    "org.label-schema.name": "CentOS Base Image",
                    "org.label-schema.schema-version": "1.0",
                    "org.label-schema.vendor": "CentOS"
                }
            },
            "NetworkSettings": {
                "Bridge": "",
                "SandboxID": "45464f5cbb945ceb333d7f962bc2dcc227e6f67ffea4be26a2a8bda314059035",
                "SandboxKey": "/var/run/docker/netns/45464f5cbb94",
                "Ports": {},
                "HairpinMode": false,
                "LinkLocalIPv6Address": "",
                "LinkLocalIPv6PrefixLen": 0,
                "SecondaryIPAddresses": null,
                "SecondaryIPv6Addresses": null,
                "EndpointID": "6ab3920f2846fc00456d31334a926d3190b287867be8c4e281dd0c466299d05f",
                "Gateway": "172.17.0.1",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "IPAddress": "172.17.0.2",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "MacAddress": "02:42:ac:11:00:02",
                "Networks": {
                    "bridge": {
                        "IPAMConfig": null,
                        "Links": null,
                        "Aliases": null,
                        "MacAddress": "02:42:ac:11:00:02",
                        "NetworkID": "86d1b8fcf7b4c1312b01326fdf6df21fdd3e19677d1887d15a8ca643507cb6cc",
                        "EndpointID": "6ab3920f2846fc00456d31334a926d3190b287867be8c4e281dd0c466299d05f",
                        "Gateway": "172.17.0.1",
                        "IPAddress": "172.17.0.2",
                        "IPPrefixLen": 16,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
                        "DriverOpts": null,
                        "DNSNames": null
                    }
                }
            }
        }
    ]
    
    
  • 从容器内拷贝文件到主机

    [root@localhost ~]# docker  exec  -it  c_3   bash
    [root@4b7ee7877d0d usr]# pwd
    /usr
    [root@4b7ee7877d0d usr]# touch   test   #在容器内创建文件
    [root@4b7ee7877d0d usr]# ls
    bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  test  tmp
    [root@4b7ee7877d0d usr]# exit
    exit
    
    # 在主机上使用命令将容器内的文件拷贝到主机上面
    docker  cp  容器的ID:文件路径       主机的路径
    [root@localhost ~]# docker  cp c_3:/usr/test   /home/
    Successfully copied 1.54kB to /home/
    [root@localhost ~]# ls  /home/
    chengtao  cuiwei  download  go  nginx_html_bak  test  xqj
    [root@localhost ~]#
    

4、docker容器的数据卷

数据卷

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷

在这里插入图片描述

1、 配置数据卷

  • 创建启动容器时,使用-v参数 设置数据卷

[root@localhost ~]# docker  run -it  --name=c1  -v /root/data:/root/data_container   centos  /bin/bash
[root@f407df6739cb /]# cd /root/
#容器内的data_container目录
[root@f407df6739cb ~]# ls -l
total 12
-rw-------. 1 root root 2361 Sep 15  2021 anaconda-ks.cfg
-rw-r--r--. 1 root root  608 Sep 15  2021 anaconda-post.log
drwxr-xr-x. 2 root root    6 Mar 25 12:42 data_container
-rw-------. 1 root root 2059 Sep 15  2021 original-ks.cfg

#宿主机的data目录
[root@localhost ~]# ll
总用量 10336
-rw-------. 1 root root     1217 3月   6 05:11 anaconda-ks.cfg
-rwxrwxrwx. 1 root root 10577344 3月   5 22:37 apache-tomcat-8.5.78.tar.gz
drwxr-xr-x. 2 root root        6 3月  25 20:42 data
drwxr-xr-x. 3 root root       53 3月   5 21:23 nginx
drwxr-xr-x. 3 root root       20 3月  17 16:47 sh
[root@localhost ~]#

在宿主机中的data目录下创建了一个test.txt的文件,同样的在容器里面的data_container目录也会生成一个test.txt 的文件
[root@localhost ~]# cd data/
[root@localhost data]# ll
总用量 0
[root@localhost data]# touch  test.txt
[root@localhost data]# ll
总用量 0
-rw-r--r--. 1 root root 0 3月  25 20:44 test.txt
[root@localhost data]#
[root@f407df6739cb data_container]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
[root@f407df6739cb data_container]#

2、两个容器挂载同一个数据卷,实现两个容器之间的数据交换

#创建C3容器
[root@localhost data]# docker  run  -it  --name=c3  -v /root/data:/root/data  centos
[root@98470426ff06 /]#
[root@98470426ff06 /]#
[root@98470426ff06 /]# cd  /root/data/
[root@98470426ff06 data]# ls -l
total 4
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
[root@98470426ff06 data]#

#创建C4容器
[root@localhost data]# docker  run  -it  --name=c4  -v /root/data:/root/data  centos
[root@d5926b80c63b /]# cd  /root/data/
[root@d5926b80c63b data]# ll
bash: ll: command not found
[root@d5926b80c63b data]# ls -l
total 4
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
[root@d5926b80c63b data]#
#C3和C4容器挂载的都是宿主机的同一个数据卷  /root/data

#在C3容器中的data目录中创建一个xqj.txt的文件
[root@98470426ff06 data]# echo  hehe   > xqj.txt
[root@98470426ff06 data]# ls -l
total 8
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
-rw-r--r--. 1 root root 5 Mar 25 12:58 xqj.txt
[root@98470426ff06 data]#

#在C4容器中可以看到所创建的xqj.txt文件已经被同步过来了
[root@d5926b80c63b data]# ls -l
total 8
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
-rw-r--r--. 1 root root 5 Mar 25 12:58 xqj.txt
[root@d5926b80c63b data]# cat xqj.txt
hehe
[root@d5926b80c63b data]#


3、数据卷容器

多容器进行数据操作

  • 多个容器挂载同一个数据卷

  • 数据卷容器

1、配置数据卷容器
  • 创建启动c3数据卷容器,使用 –v 参数 设置数据卷

    [root@localhost ~]# docker  run -it  --name=c3  -v /volume  centos  /bin/bash
    [root@9dcd3c810d0a /]# ls -l
    total 0
    drwxr-xr-x.   2 root root   6 Mar 26 02:45 volume
    # 使用sinpect参数查看数据库容器对应的宿主机的目录
    [root@localhost ~]# docker  inspect  c3
     "Mounts": [
                {
                    "Type": "volume",
                    "Name": "b4f6538092a466be04c9ec6709c8da535981fa7d1f60f0af4c21f73a516ec822",
                    "Source": "/var/lib/docker/volumes/b4f6538092a466be04c9ec6709c8da535981fa7d1f60f0af4c21f73a516ec822/_data",   #宿主机的目录
                    "Destination": "/volume",  #docker容器目录
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    
    
  • 创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷

    [root@localhost ~]# docker  run -it  --name=c1  --volumes-from  c3  centos /bin/bash
    [root@9c48c283bf32 /]# ls -l
    total 0
    drwxr-xr-x.   2 root root   6 Mar 26 02:45 volume
    
    [root@localhost ~]#  docker  run -it  --name=c2  --volumes-from  c3  centos /bin/bash
    [root@f1ec50c91653 /]# ls -l
    total 0
    drwxr-xr-x.   2 root root   6 Mar 26 02:45 volume
    
    

    \1. 数据卷概念

    • 宿主机的一个目录或文件

    \2. 数据卷作用

    • 容器数据持久化

    • 客户端和容器数据交换

    • 容器间数据交换

    \3. 数据卷容器

    • 创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )。

    • 通过简单方式实现数据卷配置

5、DOCKer容器部署

1、 需求

  • 在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server。

2、实现步骤

  • 搜索mysql镜像
  • 拉取mysql镜像
  • 创建容器
  • 操作容器中的mysql

3、MySQL部署:

  • 容器内的网络服务和外部机器不能直接通信

  • 外部机器和宿主机可以直接通信

  • 宿主机和容器可以直接通信

  • 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机 器访问宿主机的该端口,从而间接访问容器的服务。

  • 这种操作称为:端口映射

    在这里插入图片描述

#搜索镜像
[root@localhost _data]# docker  search  mysql:5.6
NAME                    DESCRIPTION                                      STARS     OFFICIAL
webimp/mysql-56-slim    MySQL with a small memory footprint, based o…   1
gmgdocker/mysql5.6      mysql:5.6                                        0
14221687/mysql          mysql:5.6                                        0
deardooley/mysql        Simple patch to the mysql:5.6 image to allow…   0
agaveapi/mysql          extends trusted mysql:5.6 image with an addi…   0
xiematthew/lego-mysql   with initialized SQL script from mysql:5.6       0
cnbbx/mysql             docker pull cnbbx/mysql:5.6.48                   0
jyhsanzero/mysql        gcr.io/ml-pipeline/mysql:5.6                     0
tcftcf/mysql            docker  run  --name mysql -p 3306:3306 -e MY…   0
sujipillai/mysql        mysql image built from base image: mysql:5.6…   0
hejiazhen/mysql-ms      from mysql:5.6.45                                0
bameri/mysql5           This MySql:5.6.23 image is propagated withou…   0
bameri/mysql            This MySql:5.6.23 image is propagated with a…   0
sagardockerhub/mysql    This is mysql:5.6 version image used for stu…   0

#下载镜像
[root@localhost _data]# docker  pull   mysql:5.6
5.6: Pulling from library/mysql
35b2232c987e: Pull complete
fc55c00e48f2: Pull complete
0030405130e3: Pull complete
e1fef7f6a8d1: Pull complete
1c76272398bb: Pull complete
f57e698171b6: Pull complete
f5b825b269c0: Pull complete
dcb0af686073: Pull complete
27bbfeb886d1: Pull complete
6f70cc868145: Pull complete
1f6637f4600d: Pull complete
Digest: sha256:20575ecebe6216036d25dab5903808211f1e9ba63dc7825ac20cb975e34cfcae
Status: Downloaded newer image for mysql:5.6
docker.io/library/mysql:5.6


#创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
[root@localhost ~]# mkdir mysql
[root@localhost ~]# cd mysql/

[root@localhost mysql]# docker run -id \
> -p 3307:3306 \
> --name=c_mysql \
> -v $PWD/conf:/etc/mysql/conf.d \
> -v $PWD/logs:/logs \
> -v $PWD/data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=123456 \
> mysql:5.6
b69171bb83ea3be69cc50fa5f9d48fb87d76cf4f76ede170cf753be4b2071ac4
  • 参数说明:
    • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • **-e MYSQL_ROOT_PASSWORD=123456:**初始化 root 用户的密码。

进入容器

[root@localhost mysql]# docker  exec  -it c_mysql  /bin/bash
root@b69171bb83ea:/# mysql   -uroot  -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.51 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show  databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql>

使用外部机器连接容器中的mysql

4、Tomcat部署

​ 1、搜索tomcat镜像

[root@localhost db1]# docker   search  tomcat
NAME                                            DESCRIPTION                                      STARS     OFFICIAL
tomcat                                          Apache Tomcat is an open source implementati…   3651      [OK]
tomee                                           Apache TomEE is an all-Apache Java EE certif…   114       [OK]
bitnami/tomcat                                  Bitnami Tomcat Docker Image                      50
bitnamicharts/tomcat                                                                             0
secoresearch/tomcat-varnish                     Tomcat and Varnish 5.0                           0
vulhub/tomcat                                                                                    0
chainguard/tomcat                               Build, ship and run secure software with Cha…   0
samply/tomcat-common                                                                             0
wnprcehr/tomcat                                                                                  0
rapidfort/tomcat10-openjdk17-ib                                                                  0
jumpserver/tomcat                               Apache Tomcat is an open source implementati…   0
eclipse/rdf4j-workbench                         Dockerfile for Eclipse RDF4J Server and Work…   8
semoss/docker-tomcat                            Tomcat, Java, Maven, and Git on top of debian    0
eclipse/hadoop-dev                              Ubuntu 14.04, Maven 3.3.9, JDK8, Tomcat 8        0
dhis2/base-dev                                  Images in this repository contains DHIS2 WAR…   0
eclipse/alpine_jdk8                             Based on Alpine 3.3. JDK 1.8, Maven 3.3.9, T…   1
openidentityplatform/openam-j2ee-agent-tomcat   OpenAM Java EE Policy Agent for Apache Tomcat    1
dhis2/base                                      Images in this repository contains DHIS2 WAR…   0
jelastic/tomcat                                 An image of the Tomcat Java application serv…   4
cfje/tomcat-resource                            Tomcat Concourse Resource                        2
rightctrl/tomcat                                CentOS , Oracle Java, tomcat application ssl…   7
amd64/tomcat                                    Apache Tomcat is an open source implementati…   8
tomcat2111/phpredisadmin                        This is a Docker image for phpredisadmin         0
arm64v8/tomcat                                  Apache Tomcat is an open source implementati…   11
softwareplant/tomcat                            Tomcat images for jira-cloud testing             0

​ 2、拉取tomcat镜像

[root@localhost db1]# docker  pull  tomcat
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Waiting
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
77b694f83996: Pull complete
0f611256ec3a: Pull complete
4f25def12f23: Pull complete
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost db1]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
tomcat       latest    fb5657adc892   2 years ago   680MB
mysql        5.6       dd3b2a5dcb48   2 years ago   303MB
centos       latest    5d0da3dc9764   2 years ago   231MB

​ 3、创建容器,设置端口映射、目录映射

[root@localhost ~]# cd tomcat/
[root@localhost tomcat]# pwd
/root/tomcat
[root@localhost tomcat]# docker run -id --name=c_tomcat -p 8089:8080 -v $PWD:/usr/local/tomcat/webapps tomcat
4ac313b6010a2a358036e6fdc6b5358ed4daa2cc9e926e5039ec86bfd25c7b33

参数说明:

  • **-p 8080:8080:**将容器的8080端口映射到主机的8080端口

    **-v $PWD:/usr/local/tomcat/webapps:**将主机中当前目录挂载到容器的webapps

[root@localhost tomcat]# mkdir   test
[root@localhost tomcat]# cat test/index.html
<html>
<h1>
HELLO  TOMCAT_DOCKER

<h1>


</html>

在这里插入图片描述

5、Nginx部署

  1. 搜索nginx镜像
docker search nginx
  1. 拉取nginx镜像
docker pull nginx
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
  • 参数说明:
    • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
  1. 使用外部机器访问nginx

6、radius部署

  1. 搜索redis镜像
docker search redis
  1. 拉取redis镜像
docker pull redis:5.0
  1. 创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
  1. 使用外部机器连接redis
./redis-cli.exe -h 192.168.149.135 -p 6379

DockerFile

1、docker镜像原理

一、操作系统组成部分

​ 进程调度子系统

进程通信子系统 

​ 内存管理子系统

设备管理子系统 

文件管理子系统 •

​ 网络通信子系统

作业控制子系统 操 

二、Linux文件系统由bootfs和rootfs两部分组成

​ • bootfs:包含bootloader(引导加载程序)和 kernel(内核)

​ • rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev, /proc,/bin,/etc等标准目录和文件

​ • 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu ,centos等

在这里插入图片描述

三、docker镜像原理

​ • Docker镜像是由特殊的文件系统叠加而成

​ • 最底端是 bootfs,并使用宿主机的bootfs

​ • 第二层是 root文件系统rootfs,称为base image

​ • 然后再往上可以叠加其他的镜像文件

​ • 统一文件系统(Union File System)技术能够将不同的 层整合成一个文件系统,为这些层提供了一个统一 的视角 ,这样就隐藏了多层的存在,在用户的角度看来,只存在 一个文件系统

​ • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称 为父镜像,最底部的镜像成为基础镜像。

​ • 当从一个镜像启动容器时,Docker会在最顶层加载一个读 写文件系统作为容器

​ 在这里插入图片描述

2、镜像制作

一、docker镜像如何制作

  • 容器转为镜像

    docker commit 容器id 镜像名称:版本号
    
    docker save -o 压缩文件名称 镜像名称:版本号
    
    docker load –i 压缩文件名称
    

将已经启动的tomca容器转换为镜像

[root@localhost ~]# docker  commit  4ac313b6010a  xqj:1.1
sha256:2d29c76a128b5b19ca76167164045ab8bcc505aa275024674d07cbd740007d63
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
xqj          1.1       2d29c76a128b   6 seconds ago   680MB    刚刚从容器转换为镜像tomcat
nginx        latest    605c77e624dd   2 years ago     141MB
tomcat       latest    fb5657adc892   2 years ago     680MB
redis        5.0       c5da061a611a   2 years ago     110MB
redis        latest    7614ae9453d1   2 years ago     113MB
mysql        5.6       dd3b2a5dcb48   2 years ago     303MB
centos       latest    5d0da3dc9764   2 years ago     231MB

#打包,将从容器转换为镜像,然后打包成tar包
[root@localhost ~]# docker  save -o  xqj_tomcat.tar  xqj:1.1
[root@localhost ~]# ll
-rw-------. 1 root root 692052480 3月  31 21:46 xqj_tomcat.tar

#将打包后的镜像文件,解压,并已容器的形式启动
[root@localhost ~]# docker  load  -i xqj_tomcat.tar
671d434396f2: Loading layer [==================================================>]  75.26kB/75.26kB
Loaded image: xqj:1.1
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
xqj          1.1       2d29c76a128b   7 minutes ago   680MB
nginx        latest    605c77e624dd   2 years ago     141MB
tomcat       latest    fb5657adc892   2 years ago     680MB
redis        5.0       c5da061a611a   2 years ago     110MB
redis        latest    7614ae9453d1   2 years ago     113MB
mysql        5.6       dd3b2a5dcb48   2 years ago     303MB
centos       latest    5d0da3dc9764   2 years ago     231MB

[root@localhost ~]# docker  run  -id  --name=new_tomcat   xqj:1.1
4298cdea690683e86b3d76f036d31edd2927ede152ad0defd7e24c62b99ddad9
[root@localhost ~]# docker  exec  -it  new_tomcat bash
root@4298cdea6906:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@4298cdea6906:/usr/local/tomcat# cd ~
root@4298cdea6906:~# ls
ITheima.txt  xqj.txt
root@4298cdea6906:~#

3、DockerFile 概念

  • dockerFile是一个文本文件
  • 包含了一条条指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件 ,构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝移植

Dochub网址:https://hub.docker.com

DockerFile 常用命令

关键字作用备注
FROM指定父镜像指定dockerfile基于那个image构建
MAINTAINER作者信息用来标明这个dockerfile谁写的
LABEL标签用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN执行命令执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD容器启动命令提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV环境变量指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG构建参数构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME定义外部可以挂载的数据卷指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER指定执行用户指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL发送信号量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

一、定义dockerfile,发布spring-boot项目

实现步骤

  • 将spring的jar包上传至服务器中

    [root@localhost Dockerfile]# ll
    总用量 22452
    -rw-r--r--. 1 root root 22983101 4月   1 21:47 test2-0.0.1-SNAPSHOT.jar   #jar包
    [root@localhost Dockerfile]#
    
  • 编写dockerfile文件

    [root@localhost Dockerfile]# cat  springboot_dockerfile
            FROM  openjdk:11   #定义父镜像为openjdk的11版本
            ADD test2-0.0.1-SNAPSHOT.jar app.jar  #镜像jar包添加到容器中,并重命名为app.jar
            CMD java -jar  app.jar   #定义容器启动时执行的命令,即运行jar包
    
  • 构建镜像文件

    docker bulid –f dockerfile文件路径 –t 镜像名称:版本
    [root@localhost Dockerfile]# docker  build  -f ./springboot_dockerfile   -t app .
    [root@localhost Dockerfile]# docker  images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    app          latest    7e5829644040   47 hours ago   682MB
    
  • 使用镜像文件启动容器,并成功访问

    [root@localhost Dockerfile]# docker  run  -id  --name=app  -p 9000:8002  app:latest
    

    在这里插入图片描述

二、自定义centos7镜像

要求:

自定义登录路径为 /usr

可以使用vim

实现步骤

  • 编写dockerfile文件

    [root@localhost docker_files]# cat centos_dockerfile
    FROM centos:7
    RUN yum -y install  vim
    WORKDIR /usr
    CMD /bin/bash
    
  • 生成镜像

    [root@localhost docker_files]# docker  build  -f centos_dockerfile  -t xqj_centos:1 .
    [+] Building 78.6s (7/7) FINISHED                                                                                                                   docker:default
     => [internal] load build definition from centos_dockerfile                                                                                                   0.0s
     => => transferring dockerfile: 170B                                                                                                                          0.0s
     => [internal] load metadata for docker.io/library/centos:7                                                                                                  15.6s
     => [internal] load .dockerignore                                                                                                                             0.0s
     => => transferring context: 2B                                                                                                                               0.0s
     => CACHED [1/3] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987                                      0.0s
     => [2/3] RUN yum -y install  vim                                                                                                                            61.9s
     => [3/3] WORKDIR /usr                                                                                                                                        0.0s
     => exporting to image                                                                                                                                        0.9s
     => => exporting layers                                                                                                                                       0.9s
     => => writing image sha256:2451823a271c3a8a95a37167b365f0ef9cccdc89b8432c842b5f96ceba5090aa                                                                  0.0s
     => => naming to docker.io/library/xqj_centos:1                                                       
    
  • 使用镜像启动容器

    [root@localhost docker_files]# docker  run  -id  --name=c_3  xqj_centos:1
    4b7ee7877d0d5256cbb63b04acfaaded69ce6b35520814930c29e81835f8e784
    [root@localhost docker_files]# docker  exec  -it   c_3  /bin/bash
    

Docker 服务编排

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停 ,维护的工作量会很大。

  • 要从Dockerfile build image 或者去dockerhub拉取image
  • 要创建多个container
  • 要管理这些container(启动停止删除)

服务编排: 按照一定的业务规则批量管理容器

Docker Compose

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建 启动和停止。使用步骤:

  • 利用 Dockerfile 定义运行环境镜像

  • 使用 docker-compose.yml 定义组成应用的各服务

  • 运行 docker-compose up 启动应用

    在这里插入图片描述

一、安装Docker Compose

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version

二、卸载Docker Compose

# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

三、 使用docker compose编排nginx+springboot项目

  1. 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose

2.编写 docker-compose.yml 文件

version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"

3.创建./nginx/conf.d目录

mkdir -p ./nginx/conf.d

4.在./nginx/conf.d目录下 编写itheima.conf文件

server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }
   
}
  1. 在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up  -d

5.测试访问

在这里插入图片描述

Docker 私有仓库

Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像 到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜 像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。

一、私有仓库搭建

# 1、拉取私有仓库镜像 
docker pull registry
# 2、启动私有仓库容器 
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json   
vim /etc/docker/daemon.json    
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip 
{"insecure-registries":["私有仓库服务器ip:5000"]} 
# 5、重启docker 服务 
systemctl restart docker
docker start registry

二、将镜像上传至私有仓库

# 1、标记镜像为私有仓库的镜像     
docker tag centos:7 私有仓库服务器IP:5000/centos:7
 
# 2、上传标记的镜像     
docker push 私有仓库服务器IP:5000/centos:7

三、 从私有仓库拉取镜像

#拉取镜像 
docker pull 私有仓库服务器ip:5000/centos:7

四、列出私有仓库的所有镜像

#curl  http://仓库服务器ip:5000/v2/_catalog
[root@localhost ~]# curl   http://10.201.9.133:5000/v2/_catalog
{"repositories":["app","centos"]}

五、列出私有仓库的 centos 镜像有哪些tag

# curl http://服务器ip:5000/v2/centos/tags/list
[root@localhost ~]# curl http://10.201.9.133:5000/v2/centos/tags/list
{"name":"centos","tags":["7"]}

更多推荐