**
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
然后执行启动,并重新设置密码,并重复上面的步骤