docker基本用法
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 设置稳定的仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vxdxcg5s.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker images
## 默认会拉取最新的,不过可以指定tags的方式拉取对应的镜像
dokcer pull hello-world(镜像名)
docker run --name hellodocker(别名) hello-world
docker ps -a
docker rmi -f imageId
docker rmi -f $(docker images)
## 删除容器
docker rmi -f $(docker ps -aq)
# -d 后台运行
# --name 指定一个名称
# -p 将默认的8080端口映射为一个新的端口
docker run -d --name mytomcat -p 8888:8080 tomcat
# 进入到镜像中
# 可以是containerId或者是names
docker exec -it 7940b96bcca6 /bin/bash
docker run -d --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 --privileged mysql
### 连接不上的问题排查
docker exec -it mysql /bin/bash
mysql -uroot -p
Enter password:
mysql> select host,user,plugin,authentication_string from mysql.user;
#host为 % 表示不限制ip localhost表示本机使用 plugin非mysql_native_password 则需要修改密码
mysql> use mysql;
mysql> alter user 'root'@'%' identified with mysql_native_password by '123';
mysql> flush privileges;
mysql> select host,user,plugin,authentication_string from mysql.user;
验证
> 将官网上的mogodb的Dockerfile放入到我们的物理主机上,
并执行。
#mogodb-my 起个别名
docker build -t mogodb-my .
docker commit mycentos vim-centos
通过Dockerfile可以追踪image生成的过程便于排查问题,而container的方式看不到生成的细节,所以不推荐使用,可以适当使用。
docker top mytomcat
docker stats mytomcat
#限制系统资源的使用(否者会无限制消耗系统的资源)
#--memory 100M 限制内存
#--cpu-shares 10 限制CPU资源占比,例如两个container一个配置10,一个配置20那么他们两个的CPU占比应该后者是前者的两倍 即1:2
docker run -d --name mytomcat02 --memory 100M --cpu-shares 10 -p 8000:8080 tomcat
FROM openjdk:8
MAINTAINER Bellamy.XIAO
LABEL name="demo" version="1.0" author="Bellamy.XIAO"
COPY demo-0.0.1-SNAPSHOT.jar demo-image.jar
CMD ["java","-jar","demo-image.jar"]
## build
docker build -t spring-boot-demo .
## query
docker images
## run
docker run -d --name demo -p 9000:8080 spring-boot-demo
## log
docker logs containerId
# 生成tag:
docker tag spring-boot-demo 7634xxx/spring-boot:v1.0
# 官方仓库: https://hub.docker.com
登录: docker login
tag: docker tag ImageId 7634xxx/spring-boot :v1.0
push: docker push 7634xxx/spring-boot:v1.0
# 阿里云仓库
登录: sudo docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com
tag: sudo docker tag ImageId registry.cn-hangzhou.aliyuncs.com/docker-namesapce/docker-repository:version
push : sudo docker push registry.cn-hangzhou.aliyuncs.com/docker-namesapce/docker-repository:version
# 私服[harbor]: https://github.com/goharbor/harbor
#下载
sudo curl -L git.io/scope -o /usr/local/bin/scope
#授权
sudo chmod a+x /usr/local/bin/scope
#启动(可以有多个ip)
scope launch 192.0.0.1
#停止
scope stop
#通过如下命令查看
docker network ls
NETWORK ID NAME DRIVER SCOPE
15ea9d89d616 bridge bridge local
1c62b0fd4212 host host local
375f1ab17a8b none null local
#创建,默认为bridge
docker network create net01
#通过如下命令可以得到具体信息
docker network inspect net01
信息如下:
[
{
"Name": "net01",
"Id": "b9fee626fdee",
"Created": "2019-12-19T10:50:59.641869093Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "x.0.0.0/16",
"Gateway": "x.x.x.x" #网关信息
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": { # 容器信息
"c0f8db51792b9b394b": {
"Name": "tomcat03",
"EndpointID": "9a966183a87",
"MacAddress": "",
"IPv4Address": "x.x.x.x/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
这是否意味着我们可以通过上述三种方式自定义网络
# 重新启动一个容器,命令如下
docker run -d --name tomcat03 --network net01 -p 8082:8080 tomcat
#可以对比容器使用network参数与未使用的ip变化
神奇的是在tomcat03中此刻却无法ping通使用了docker默认的network创建的tomcat01容器。 原因在于自定义的网络跟docker0不在同一个网段所以无法ping通(tomcat03使用的是自定义网络,而tomcat01使用的则是默认的网络),那么tomcat03和tomcat01当然无法ping通。
# 查看当前docker默认的bridge
docker inspect bridge
[
{
"Name": "bridge",
"Id": "15ea9d89d6165304b561b",
"Created": "2019-12-19T10:43:46.750789678Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "x.x.0.0/16",
"Gateway": "x.x.x.x"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": { #可以看到默认网络的容器信息
"44371744ca1a": {
"Name": "tomcat01",
"EndpointID": "7005e8d9f9aab442",
"MacAddress": "",
"IPv4Address": "x.x.x.x/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
# 将tomcat01也加入到自定义网络中
docker network connect net01 tomcat01
#再次查看net01发现tomcat01也在当中了
# 通过如下命令查看tomcat01的网络信息发现tomcat01中的网络此时多了一个ip地址
docker inspect tomcat01
#此时tomcat01和tomcat03因为有同网段的ip地址,所以又可以互通
结论: 为什么容器之间能够相互连通,是因为docker会创建这种桥接模式,而桥接模式实际上是使用了veth-pair技术,所以容器之间可以进行通信。
如果真的可以那么就不需要担心ip地址的变化了,就像微服务一样,服务与服务之间的调用通过注册咋注册中心上的服务名字即可调用。遗憾的是我们在使用默认的docker网络是无法用名字的方式ping通
#增加link的方式进行指定
docker run -d --name tomcat05 --link tomcat01 -p 8085:8080 tomcat
# 自定义网络的方式是可以互通的
# 创建一个overlay网络
docker network create -d overlay o-net
#创建mysql
docker service create --name mysql -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=db_wordpress --network o-net mysql:5.6
#创建wordpress
docker service create --name wordpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network o-net wordpress
#查看网络信息
docker network inspect o-net
[
{
"Name": "o-net",
"Id": "45x28fm6",
"Scope": "swarm",
"Driver": "overlay",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet":
"Gateway":
}
]
},
"Containers": {
"64cf17fd1f0": {
"Name": "mysql.1.s1hfbsju",
"EndpointID":
"MacAddress":
"IPv4Address":
},
"lb-overlay-net": {
"Name": "overlay-net-endpoint",
"EndpointID": ,
"MacAddress":,
"IPv4Address": ,
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4097"
},
"Labels": {},
"Peers": [
{
"Name":
"IP":
},
{
"Name":
"IP":
}
]
}
]
# 查看,创建容器的时候会自动生成一个默认的volume
docker volume ls
DRIVER VOLUME NAME
local 1deb0814c8723496c03aacecbe0535e47f39e1131286f3c0d1090eb8717617e8
local 3a7e9642878f96afe5b307b39dc184aad6f0ea379e53592b989e2d513a44c6b9
local 6f4e05e55601c866a614dd60b05386763e8081b93465472adbdceef5a1a2c60a
如上所示 VOLUME NAME太长不容易记忆
在创建容器的时候可以指定 -v
docker run -d --name mysql -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
DRIVER VOLUME NAME
local mysql
# 查看详情
docker volume inspect mysql
[
{
"CreatedAt": "2019-12-23T06:40:53Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql/_data",
"Name": "mysql",
"Options": null,
"Scope": "local"
}
]
# 测试是否能够持久化
1.创建一个数据库tester
2. 退出容器并删除容器
3.查看volume发现,volume并不会随着容器的删除而删除
4.执行命令:docker run -d --name mysql -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql(volume属性指向之前创建的volume->mysql)
docker run -d --name mysql -p 3306:3306 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --net net-cluster mysql:latest --log-bin=mysql-bin --binlog-format=ROW --server_id=101(甚至可以直接修改my.cnf)
5.进入mysql并show databases;发现之前创建的数据库还在。
# 1. 创建一个文件 /usr/local/web/1.html
内容: <h1>hello</h1>
#2. 挂载并运行:docker run -d --name tomcat -p 8888:8080 -v
/usr/local/web/:/usr/local/tomcat/webapps/web/ tomcat
或者
docker run -d --name tomcat02 -p 9000:8080 --mount type=bind,source=/usr/local/web/,target=/usr/local/tomcat/webapps/web/ tomcat
#3.访问http://ip:8888/web/1.html查看内容
#4.进入到Tomcat中查看,会发现有个一样的目录和文件。
#5.再次修改物理机中的1.html
加入内容<h2>Docker</h2>
#6.重新访问浏览器会发现内容的变化
如果使用命令行的方式,需要每次先创建自定义网路、挂载等再一个个的启动运行容器相对来说比较麻烦,下面来看看Docker容器管理。
单机版多容器管理
集群版多容器管理 manager: work(2个):
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
k2bfj4ipf63u * node1 Ready Active Leader 19.03.4
lf9i7sj17u5b node2 Ready Active 19.03.4
69tfr9cq6j61 node3 Ready Active 19.03.4
#示例命令:
docker node promote node2
docker node demote node2
docker service create --name tomcat -p 8080:8080 tomcat
#命令:
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qy870rkl tomcat replicated 1/1 tomcat:latest *:8080->8080/tcp
docker service logs tomcat
docker service ps tomcat
docker service scale tomcat=3
# 删除其中一个容器
docker rm -f bfaxc6smw
#查看
$ docker service ps tomcat
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
50000saiypxh tomcat.1 tomcat:latest node2 Running Running 30 minutes ago
3x4bfaxc6smw tomcat.2 tomcat:latest node3 Running Running 19 minutes ago
vicrsu2aebud \_ tomcat.2 tomcat:latest node3 Shutdown Failed 19 minutes ago "task: non-zero exit (137)"
ot50dhj0b1at tomcat.3 tomcat:latest node1 Running Running 23 minutes ago
docker service rm tomcat
# 再次查看
docker service ls
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有