**

ubuntu 中docker使用

**

docker安装要求:必须是内核为3.10以上64位操作系统

查看内核版本:

uname -r

查看操作系统位数 :

uname --m

修改阿里云数据源

把原有的数据源备份

cp /etc/apt/sources.list /etc/apt/sources.list.bak

查看系统代号 :

lsb_release -c

系统代号说明:

Ubuntu 12.04 (LTS)代号为precise
Ubuntu 14.04 (LTS)代号为trusty
Ubuntu 15.04 代号为vivid
Ubuntu 15.10 代号为wily
Ubuntu 16.04 (LTS)代号为xenial
Ubuntu 18.04 (LTS)代号为bionic

不同的系统版本对应不同的系统代号,可进行修改替换

deb 地址 系统代号 软件包的分类(main restricted universe multiverse四种)

编辑sources.list

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

更新软件列表 (更新的是软件列表)

sudo apt-get update

更新软件包 (更新的是已经安装过的软件)

sudo apt-get upgrade

安装docker:

使用脚本安装Docker

使用在线安装脚本

curl -sSL https://get.daocloud.io/docker | sh

如果不是root用户直接操作docker会报错 permission denied 没有权限

如果想要用非root用户执行,需要执行

sudo usermod -aG docker 用户名

(将这个用户加到docker组里) 然后重新登陆(断开连接重新连接)

查看docker版本

docker version

修改docker源

vi /lib/systemd/system/docker.service

 ExecStart=/usr/bin/dockerd -H fd://

修改为

ExecStart=/usr/bin/dockerd --registry-mirror=https://jxus37ac.mirror.aliyuncs.com

使用这个命令重载docker配置:

systemctl daemon-reload

重启docker :

service docker restart

查看运行状态:

systemctl status docker

运行第一个docker

docker run ubuntu:15.10 /bin/echo "hello Docker"
说明:
docker 运行 ubuntu版本为15.10 用echo 执行"hello Docker"

第一次运行因为没有所以需要下载如下:

root@ubuntu:/home/wang# docker run ubuntu:15.10 /bin/echo "hello Docker"
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete
759aa75f3cee: Pull complete
3fa871dc8a2b: Pull complete
224c42ae46e7: Pull complete
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
hello Docker

第二次因为已经下载了所以直接运行打印了

root@ubuntu:/home/wang# docker run ubuntu:15.10 /bin/echo "hello Docker"
hello Docker

查看镜像:

docker images

root@ubuntu:/home/wang# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              15.10               9b9cb95443b5        2 years ago         137MB

查看运行的docker

docker ps

查看所有的docker包括运行过的

docker ps -a

可以删除指定的运行记录

docker rm (containerid)

批量删除指定的运行记录

docker rm (containerid1) (containerid2) (containerid3)

运行交互式的容器

进入到容器里

docker run -it ubuntu:15.10 /bin/bash

root@ubuntu: 会变为 root@fc548137a20d: 这种形式,@后边的可能不一样但都是这种格式

后台运行和停止容器

docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello decker; sleep 1; done"
说明:
docker 运行 后台运行 运行ubuntu版本为15.10的 调用的是sh 执行的是死循环,不断地打印 hello decker 每1秒执行一次

查看docker日志

docker logs 容器id

停止docker

docker stop 容器id

跟踪日志(实时更新滚动形式)

docker logs -f 容器id

与后台正在运行的容器交互

docker exec -it 容器id /bin/bash

运行web容器

docker run -d -P training/webapp python app.py
说明 docker 运行 后台运行 端口映射到宿主机器上 项目 执行的命令为python 启动的是app.py


root@ubuntu:/home/wang# docker run -d -P training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
10bbbc0fc0ff: Pull complete
fca59b508e9f: Pull complete
e7ae2541b15b: Pull complete
9dd97ef58ce9: Pull complete
a4c1b0cb7af7: Pull complete
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
bdd1eaac495b696fe8376d2b4864b6338a79d2fa03e6c18e6a781c82281f9a43

查看运行:

root@ubuntu:/home/wang# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
bdd1eaac495b        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        0.0.0.0:32768->5000/tcp   laughing_poitras

说明:
 0.0.0.0:32768->5000/tcp   把容器的5000端口映射到 宿主机器的32768端口(这里的绑定是随机的)
 访问 ip地址:32768 即可看到效果

绑定指定的端口:

docker run -d -p 5000:5000 training/webapp python app.py
说明:
绑定指定的端口用小写的"p" 随机用大写的"P"
以上意思是把 容器的端口5000绑定到 宿主机器的5000端口上
访问 ip地址:5000 即可查看效果

查看docker运行容器的进程:

先通过 docker ps 查看运行中的容器,找到它对应的names

root@ubuntu:/home/wang# docker ps
CONTAINER ID        IMAGE               COMMAND             NAMES
fd18a8063d0e        training/webapp     "python app.py"     heuristic_keller

再根据names查看 进程

docker top heuristic_keller
说明:
docker top NAMES


root@ubuntu:/home/wang# docker top heuristic_keller
UID     PID     PPID     C    STIME   TTY     TIME       CMD
root   42055    42033    0    09:35    ?      00:00:00   python app.py

查看容器状态:

docker inspect 线程名字

得到json格式的信息:

root@ubuntu:/home/wang# docker inspect heuristic_keller
[
    {
        "Id": "fd18a8063d0e71dc49a8215d4df1145d79b36bc941ec9404488f7a6083013bf1", //创建的id
        "Created": "2018-10-04T09:35:46.556611924Z",  //创建时间
        "Path": "python",   //路径
        "Args": [    //参数
            "app.py"
        ],
        "State": {     //状态
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 42055,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-10-04T09:35:47.11283525Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
        "ResolvConfPath": "/var/lib/docker/containers/fd18a8063d0e71dc49a8215d4df1145d79b36bc941ec9404488f7a6083013bf1/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/fd18a8063d0e71dc49a8215d4df1145d79b36bc941ec9404488f7a6083013bf1/hostname",
        "HostsPath": "/var/lib/docker/containers/fd18a8063d0e71dc49a8215d4df1145d79b36bc941ec9404488f7a6083013bf1/hosts",
        "LogPath": "/var/lib/docker/containers/fd18a8063d0e71dc49a8215d4df1145d79b36bc941ec9404488f7a6083013bf1/fd18a8063d0e71dc49a8215d4df1145d79b36bc941ec9404488f7a6083013bf1-json.log",
        "Name": "/heuristic_keller",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "5000/tcp": [    //绑定的端口以tcp协议绑定
                    {
                        "HostIp": "",
                        "HostPort": "5000"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/asound",
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/7027448c5c707a94eff3c39d4af8209a9df5f14ad198687a4cb6166a4edb852b-init/diff:/var/lib/docker/overlay2/66fc3ad5c89f85cf9c7936655930c85e34c41467c09210cdab40db80fae35892/diff:/var/lib/docker/overlay2/e58b8ea27b7e997f4fc144f475dd5636c6e89b1b332d5724f9494b5cb0ac933e/diff:/var/lib/docker/overlay2/5bce4d9c1527e4d776f340ac5dacde1a2f9f7cef7ea463e80326b7cfb771b286/diff:/var/lib/docker/overlay2/503ec7086d5755dd6d57bd640044a415b54e6959ca16463066764500aad292a4/diff:/var/lib/docker/overlay2/139a254561efee77bf517e65f8d5455b7dce578563cd61b3a9d9780e86aaf15b/diff:/var/lib/docker/overlay2/0660157f2966de9597b187e194291ae19c79052345ce9b69b4b6329a549c53ee/diff:/var/lib/docker/overlay2/b9015b9db691c9b49739493c193aad282cbef05fd4a3246dcf51ac6afdf3a9ef/diff:/var/lib/docker/overlay2/148871183bc38e433fe179ef1d50a2ffb0eb680c66bfd896c67c841530ceab38/diff:/var/lib/docker/overlay2/d87cd66cde80d010822ec31cd7ffaddd974415a7233ac64d465d4bda1cde2a4d/diff:/var/lib/docker/overlay2/d34bfdfee6f540eb86ecac0d4e7a2685ecabc10b832ace1c5cbccb941c47f138/diff:/var/lib/docker/overlay2/a891423c3f9d21d56ee1db6c21b711dbbf79911980f8871a5c76d09c0b58314a/diff:/var/lib/docker/overlay2/2a816df9bdf4c904d54f120a79fb093ac354d935f7fdb2b730d45a9f68a61a88/diff:/var/lib/docker/overlay2/3506211767a0b430afe89bb7436da1fe181b7eac7985e3b692724f3a03004f28/diff",
                "MergedDir": "/var/lib/docker/overlay2/7027448c5c707a94eff3c39d4af8209a9df5f14ad198687a4cb6166a4edb852b/merged",
                "UpperDir": "/var/lib/docker/overlay2/7027448c5c707a94eff3c39d4af8209a9df5f14ad198687a4cb6166a4edb852b/diff",
                "WorkDir": "/var/lib/docker/overlay2/7027448c5c707a94eff3c39d4af8209a9df5f14ad198687a4cb6166a4edb852b/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "fd18a8063d0e",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "5000/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [    //容器配置的环境变量
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [    //执行的命令
                "python",
                "app.py"
            ],
            "Image": "training/webapp",   //镜像
            "Volumes": null,
            "WorkingDir": "/opt/webapp",    //工作目录
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {   //网络设置
            "Bridge": "",
            "SandboxID": "4e9971711aad7216dc59074aed01dde272315d628392ae0a32d18894f4d4429f",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5000/tcp": [
                    {
                        "HostIp": "0.0.0.0",    //允许所有人访问
                        "HostPort": "5000"    //开放的端口
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/4e9971711aad",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "685cfbc87eba4f4f5e08d2ba76344db547432c8f2177ab320e63c33fa00277be",
            "Gateway": "172.17.0.1",  //网管
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",  //容器的ip地址
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "955b8a3221ab84ddf19fa41af6961b617aa8771a1ce2ec7e0797db01567a02fe",
                    "EndpointID": "685cfbc87eba4f4f5e08d2ba76344db547432c8f2177ab320e63c33fa00277be",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

获取镜像:

docker pull 镜像名
例如:
docker pull tomcat


root@ubuntu:/home/wang# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
05d1a5232b46: Pull complete
5cee356eda6b: Pull complete
89d3385f0fd3: Pull complete
65dd87f6620b: Pull complete
78a183a01190: Pull complete
1a4499c85f97: Pull complete
2c9d39b4bfc1: Pull complete
1b1cec2222c9: Pull complete
fc95b85a81f3: Pull complete
0f3868647539: Pull complete
9b6a6eddb2d9: Pull complete
8787183cb077: Pull complete
Digest: sha256:8d120de5102cc12310de741299e9bf6f39d2d674663f2ce4e6f0f181ccfeebe7
Status: Downloaded newer image for tomcat:latest
说明:
latest 代表是最终版本

搜索镜像:

docker search 镜像名
例如:
docker search tomcat


root@ubuntu:/home/wang# docker search tomcat
NAME                                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
tomcat                                Apache Tomcat is an open source implementati…   2062                [OK]
tomee                                 Apache TomEE is an all-Apache Java EE certif…   56                  [OK]
dordoka/tomcat                        Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base…   49                                      [OK]
davidcaste/alpine-tomcat              Apache Tomcat 7/8 using Oracle Java 7/8 with…   30                                      [OK]
bitnami/tomcat                        Bitnami Tomcat Docker Image                     24                                      [OK]
consol/tomcat-7.0                     Tomcat 7.0.57, 8080, "admin/admin"              16                                      [OK]
cloudesire/tomcat                     Tomcat server, 6/7/8                            15                                      [OK]
tutum/tomcat                          Base docker image to run a Tomcat applicatio…   11
meirwa/spring-boot-tomcat-mysql-app   a sample spring-boot app using tomcat and My…   10                                      [OK]
jeanblanchard/tomcat                  Minimal Docker image with Apache Tomcat         8
aallam/tomcat-mysql                   Debian, Oracle JDK, Tomcat & MySQL              8                                       [OK]
maluuba/tomcat7-java8                 Tomcat7 with java8.                             3
rightctrl/tomcat                      CentOS , Oracle Java, tomcat application ssl…   3                                       [OK]
arm64v8/tomcat                        Apache Tomcat is an open source implementati…   2
amd64/tomcat                          Apache Tomcat is an open source implementati…   2
primetoninc/tomcat                    Apache tomcat 8.5, 8.0, 7.0                     1                                       [OK]
jelastic/tomcat                       An image of the Tomcat Java application serv…   1
fabric8/tomcat-8                      Fabric8 Tomcat 8 Image                          1                                       [OK]
99taxis/tomcat7                       Tomcat7                                         1                                       [OK]
camptocamp/tomcat-logback             Docker image for tomcat with logback integra…   1                                       [OK]
oobsri/tomcat8                        Testing CI Jobs with different names.           0
swisstopo/service-print-tomcat        backend tomcat for service-print "the true, …   0
picoded/tomcat7                       tomcat7 with jre8 and MANAGER_USER / MANAGER…   0                                       [OK]
cfje/tomcat-resource                  Tomcat Concourse Resource                       0
s390x/tomcat                          Apache Tomcat is an open source implementati…   0
说明:
OFFICIAL 如果有[OK]的标记 说明是官方的
STARS 表示用的人数

更新镜像:

第一种:

以交互的形式进入到容器(更换数据源,因为自带的数据源不能用)

docker run -it ubuntu:15.10 /bin/bash
cd /etc/apt

执行以下命令(第一句是覆盖,后面是追加)

echo deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse               > sources.list
echo deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse           >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse      >> sources.list
echo deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse  >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse       >> sources.list
echo deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse   >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse     >> sources.list
echo deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse      >> sources.list
echo deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse  >> sources.list

更新

apt-get update

安装vim

apt-get install vim

此时如果重新启动容器,则安装的vim消失不存在所以要把修改后的容器进行发布

docker commit -m="相当于日志" -a="谁修改的" 进入镜像后@后面的值(root@9ec0aef2b6ba:) 新创建的镜像名字:版本
如果版本不写默认是latest
docker commit -m="install vim" -a="wang" 9ec0aef2b6ba wang/ubuntu:v2

最后查看后发现多了一个并且大小也修改了(这里的发布只是发布到本地)

root@ubuntu:/home/wang# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wang/ubuntu         v2                  c13225a5ca05        3 minutes ago       255MB
ubuntu              15.10               9b9cb95443b5        2 years ago         137MB

最后运行测试

root@ubuntu:/home/wang# docker run -it wang/ubuntu:v2 /bin/bash
root@6919a2625b04:/#

创建和移除镜像:

删除镜像:

docker rmi 镜像id
例如:
docker rmi c13225a5ca05

Dockerfile 文件说明:

说明: 不区分大小写,但必须遵循建议使用大写字母的约定
Docker以从上到下的顺序运行 Dockerfile的指令,为了指定基本映像,第一条指令必须是 FROM
一个声明以 # 字符开头则被视为注释,可以在Docker文件中使用 RUN, CMD, FROM, EXPOSE, ENV等指定。

FROM 指令:

FROM  (FROM ubuntu)   指令用于设置后续指令的基本映射,有效的 Dockerfile 必须使用 FROM  作为其第一条指令

MAINTAINER 指令:

MAINTAINER (MAINTAINER <name>)  指定镜像的作者

RUN 指令:

RUN (RUN  /bin/bash -c 'echo "hello world"') 该指令用于执行当前镜像的任何命令

CMD 指令:

CMD 用于执行映像的应用程序,应该以下列形式总是使用CMD
CMD ["executable","param1","param2"]
这是使用CMD的首选方法,Dockerfile文件中只能有一个CMD。如果使用多个CMD,则只会执行最后一个CMD
如:
CMD ["/bin/echo","this is a echo test"]

COPY指令:

该指令用于将来自源的新文件或目录复制到目的地的容器的文件系统
如:  COPY abc/ /xyz
使用规则:
source 路径必须在构建的上下文之内,无法使用 COPU ../something /something, 因为docker构建的第一步是将上下文目录(和子目录)发送到docker守护程序
如果source 是目录,则会复制目录的全部内容,包括文件系统元数据

WORKDIR指令:

WORKDIR	 用于为Dockerfile中的RUN, CMD, COPY 指令设置工作目录。如果工作目录不存在,他默认将会创建。
我们可以在Dockerfile 文件中多次使用 WORKDIR.
备注:可以简单理解为cd命令,但是如果目录不存在他会自动创建。

EXPOSE 指令:

需要暴露的端口, 如果需要暴露多个可以像下边一样使用
EXPOSE 80
EXPOSE 8080

所有手动安装的程序都放在 /usr/local 目录下

cd /usr/local
新建一个目录:
mkdir docker
cd docker
在创建一个目录:
mkdir myubuntu
cd myubuntu
创建 Dockerfile文件
vi Dockerfile   这里的D要大写

第一个测试脚本:

FROM ubuntu:15.10     # from 来源,意思是要构建的镜像是基于ubuntu:15.10
MAINTAINER wangh909@gmail.com   # 指定制作作者
RUN  /bin/bash -c 'echo "hello world"'   # 执行打印
COPY test.txt /home     # 将test.txt文件copy到镜像 的home下
WORKDIR /home     # 指定home 为工作目录,如果没有则自动创建
EXPOSE 80    # 需要暴露的端口
EXPOSE 8080
CMD ["/bin/echo","this is a echo test"]

执行创建:

docker build -t wang/myubuntu .
bulid 创建
-t
wang/myubuntu  给镜像起个名字,不指定版本默认为 latest
. 代表当前目录找 Dockerfile文件

打印一下表示在创建

Sending build context to Docker daemon  3.072kB
Step 1/8 : FROM ubuntu:15.10        # 基于那个版本
 ---> 9b9cb95443b5
Step 2/8 : MAINTAINER wangh909@gmail.com   # 作者
 ---> Running in e27f4e751410
Removing intermediate container e27f4e751410
 ---> 4b7990c4334c
Step 3/8 : RUN /bin/bash -c 'echo "hello world"'  # 执行打印
 ---> Running in eba873bff5da
hello world                          	 # 打印结果
Removing intermediate container eba873bff5da
 ---> 485c856033f8
Step 4/8 : COPY test.txt /home    		 # copy文件
 ---> 49e5d5564bb0
Step 5/8 : WORKDIR /home     			# 构建工作空间
 ---> Running in 4b125f1f988d
Removing intermediate container 4b125f1f988d
 ---> a1594114c3d3
Step 6/8 : EXPOSE 80     				# 暴露端口
 ---> Running in 19fb938c57cf
Removing intermediate container 19fb938c57cf
 ---> 80f25d31a281
Step 7/8 : EXPOSE 8080   			    # 暴露端口
 ---> Running in 4580425e58c5
Removing intermediate container 4580425e58c5
 ---> 0ed753760a6d
Step 8/8 : CMD ["/bin/echo","this is a echo test"]
 ---> Running in 8b59fdaf41fb
Removing intermediate container 8b59fdaf41fb
 ---> 324af5f21190
Successfully built 324af5f21190
Successfully tagged wang/myubuntu:latest   # 版本为 latest 因为没有指定

查看是否成功

root@ubuntu:/usr/local/docker/myubuntu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wang/myubuntu       latest              324af5f21190        47 seconds ago      137MB
ubuntu              15.10               9b9cb95443b5        2 years ago         137MB

以交互式进入镜像查看是否存在test.txt文件

root@ubuntu:/usr/local/docker/myubuntu# docker run -it wang/myubuntu /bin/bash
root@d886d4e368e3:/home# ls
test.txt
root@d886d4e368e3:/home# cat test.txt
hello docker!
root@d886d4e368e3:/home#

设置镜像标签:

docker tag 命令,为镜像添加一个新的标签

docker tag 324af5f21190 wang/myubuntu:v2
docker tag 镜像id 镜像名称:版本
新的和原来的镜像id 相同,表示 新的是基于原来的


root@ubuntu:/usr/local/docker/myubuntu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wang/myubuntu       latest              324af5f21190        14 minutes ago      137MB
wang/myubuntu       v2                  324af5f21190        14 minutes ago      137MB


root@ubuntu:/usr/local/docker/myubuntu# docker tag 324af5f21190 wang2/myubuntu:v2
root@ubuntu:/usr/local/docker/myubuntu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wang/myubuntu       latest              324af5f21190        16 minutes ago      137MB
wang/myubuntu       v2                  324af5f21190        16 minutes ago      137MB
wang2/myubuntu      v2                  324af5f21190        16 minutes ago      137MB

此时如果在根据镜像id删除会报错

Error response from daemon: conflict: unable to delete 324af5f21190 (must be forced) - image is referenced in multiple repositories
无法删除324AF5F21190(必须强制)-在多个存储库中引用图像
意思是有多个此时想要删除不能直接删除

所以可以根据镜像名字删除

docker rmi wang/myubuntu:v2
docker rmi 镜像名字:镜像版本
删除多个
docker rmi  镜像名字:镜像版本 镜像名字:镜像版本 镜像名字:镜像版本
如果镜像的版本是latest的则不用指定版本

安装Tomcat:

下拉tomcat容器

docker pull tomcat

后台运行tomcat

docker run --name tomcat -p 8080:8080 -d tomcat
说明:
--name tomcat 给运行的镜像起个名字,不写会随机起名字
-p 8080:8080 映射8080端口
-d 后台运行
tomcat 要运行的镜像

访问 ip:8080 查看是否启动完成

以交互式进入tomcat

docker exec -it tomcat /bin/bash

exec和run的区别
docker run  是没有运行当前的docker镜像,要进入交互模式
docker exec 是已经运行了docker镜像,此时要进入交互模式

通过ls -l 命令查看目录结构

root@e4b4c712a309:/usr/local/tomcat# ls -l
total 152
-rw-r--r-- 1 root root  19539 Sep  4 22:30 BUILDING.txt
-rw-r--r-- 1 root root   6090 Sep  4 22:30 CONTRIBUTING.md
-rw-r--r-- 1 root root  57092 Sep  4 22:30 LICENSE
-rw-r--r-- 1 root root   1726 Sep  4 22:30 NOTICE
-rw-r--r-- 1 root root   3255 Sep  4 22:30 README.md
-rw-r--r-- 1 root root   7142 Sep  4 22:30 RELEASE-NOTES
-rw-r--r-- 1 root root  16262 Sep  4 22:30 RUNNING.txt
drwxr-xr-x 2 root root   4096 Sep 12 20:48 bin
drwxr-sr-x 1 root root   4096 Oct  5 08:34 conf
drwxr-sr-x 3 root staff  4096 Sep 12 20:48 include
drwxr-xr-x 2 root root   4096 Sep 12 20:48 lib
drwxrwxrwx 1 root root   4096 Oct  5 08:34 logs
drwxr-sr-x 3 root staff  4096 Sep 12 20:48 native-jni-lib
drwxr-xr-x 2 root root   4096 Sep 12 20:48 temp
drwxr-xr-x 7 root root   4096 Sep  4 22:29 webapps
drwxrwxrwx 1 root root   4096 Oct  5 08:34 work

进入到webapps目录中,这里就和普通的tomcat一样了

创建一个新的项目

mkdir test
因为这里没有vi命令所以只能用输出的方式了:
echo "hello Docker Tomcat" > index.html

访问 ip:8080/test   在浏览器看是否会有 "hello Docker Tomcat",如果有则表示成功

安装mysql

docker pull mysql


root@ubuntu:/usr/local/docker/myubuntu# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
802b00ed6f79: Pull complete
30f19a05b898: Pull complete
3e43303be5e9: Pull complete
94b281824ae2: Pull complete
51eb397095b1: Pull complete
54567da6fdf0: Pull complete
bc57ddb85cce: Pull complete
d6cd3c7302aa: Pull complete
d8263dad8dbb: Pull complete
780f2f86056d: Pull complete
8e0761cb58cd: Pull complete
7588cfc269e5: Pull complete
Digest: sha256:038f5f6ea8c8f63cfce1bce9c057ab3691cad867e18da8ad4ba6c90874d0537a
Status: Downloaded newer image for mysql:latest
root@ubuntu:/usr/local/docker/myubuntu# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              latest              41a54fe1f79d        3 weeks ago         463MB
mysql               latest              6a834f03bd02        4 weeks ago         484MB

启动

docker run -p 3306:3306 --name mysql \
 -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
 -v /usr/local/docker/mysql/logs:/var/log/mysql \
 -v /usr/local/docker/mysql/data:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=123456 \
 -d mysql

说明:
--name mysql 给运行的镜像起个名字
\  意思是可以换行,因为命令太长
-v 数据卷 意思是用左边的映射右边的
-e 设置参数 设置密码
-d mysql 后台运行mysql
: 一般遇到冒号,意思就是 左边是宿主机,右边是容器

用工具测试连接

如果出现以下错误:

client does not support authentication protocol requested by server; condier upgrading mysql client

解决方案:

1.先运行mysql,然后进入mysql
docker exec -it mysql bash
2.进入交互模式后,登录mysql
mysql -u root -p
输入密码 123123
3.进入mysql后,进行授权远程连接(注意mysql 8.0跟之前的授权方式不同)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
FLUSH PRIVILEGES;
4,更改加密规则
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
5.更新root用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
6.刷新权限
flush privileges;
OK,设置完成,再次使用 Navicat 连接数据库

修改密码

需要先删除这几个文件
/usr/local/docker/mysql/conf
/usr/local/docker/mysql/logs
/usr/local/docker/mysql/data

cd /usr/local/docker
rm -rf mysql

然后执行启动,并重新设置密码,并重复上面的步骤
10-05 18:56