一、ubuntu安装微信介绍

一直都不明白腾讯没有适配ubuntu下的微信是为啥。因为工作和系统的原因,我笔记本是ubuntu22.04.4+win10ltsc

但是其实经常用到的,就是ubuntu,自从用了ubuntu后,基本上win就不用了,现在更是直接把大头的内存都扩容到ubuntu了。

但是在Ubuntu下安装微信,其实很麻烦的。

安装微信无非就三种:

  1. 要么安装原生微信,ukylin,但是这个功能太少了,强迫症不喜欢。
  2. 比较好一点的用wine(wine, deepin-wine, ukylin-wine)
  3. 总有大佬会弄成docker镜像的。

尝鲜下docker,毕竟别人都配好了,最多挂载下路径,有问题就删容器就完事了。

二、本次实践介绍

  1. 本次实践简介

本次实践部署环境为个人测试环境

  1. 本地环境规划

本次实践环境规划:下载镜像dockurr/windows:latest,通过docker-cli或者docker compose启动容器

镜像命名

IP地址

容器镜像版本

操作系统版本

wechat

localhost

latest

ubuntu 22.04

三、检查本地Docker环境

  1. 检查本地Docker版本
检查Docker版本:docker version  
  
root@WellDone:/home/goodjob# docker version  
Client: Docker Engine - Community  
 Version:           25.0.0  
 API version:       1.44  
 Go version:        go1.21.6  
 Git commit:        e758fe5  
 Built:             Thu Jan 18 17:09:49 2024  
 OS/Arch:           linux/amd64  
 Context:           default  
  
Server: Docker Engine - Community  
 Engine:  
  Version:          25.0.0  
  API version:      1.44 (minimum version 1.24)  
  Go version:       go1.21.6  
  Git commit:       615dfdf  
  Built:            Thu Jan 18 17:09:49 2024  
  OS/Arch:          linux/amd64  
  Experimental:     false  
 containerd:  
  Version:          1.6.27  
  GitCommit:        a1496014c916f9e62104b33d1bb5bd03b0858e59  
 runc:  
  Version:          1.1.11  
  GitCommit:        v1.1.11-0-g4bccb38  
 docker-init:  
  Version:          0.19.0  
  GitCommit:        de40ad0  
root@WellDone:/home/goodjob#
  1. 检查Docker服务状态

检查Docker服务状态,确保Docker服务正常运行。

systemctl status docker  
  
root@WellDone:/home/goodjob/Downloads# systemctl status docker  
● docker.service - Docker Application Container Engine  
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)  
     Active: active (running) since Wed 2024-01-24 08:54:31 CST; 1 day 4h ago  
TriggeredBy: ● docker.socket  
       Docs: https://docs.docker.com  
   Main PID: 1549 (dockerd)  
      Tasks: 65  
     Memory: 419.5M  
        CPU: 38.874s  
     CGroup: /system.slice/docker.service  
             ├─  1549 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  
             ├─  2010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 6379 -container-ip 172.17.0.2 -container-port 6379  
             ├─  2016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 6379 -container-ip 172.17.0.2 -container-port 6379  
             ├─  2029 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5432 -container-ip 172.17.0.3 -container-port 5432  
             ├─  2036 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5432 -container-ip 172.17.0.3 -container-port 5432  
             ├─123083 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8888 -container-ip 172.17.0.4 -container-port 8080  
             └─123095 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8888 -container-ip 172.17.0.4 -container-port 8080  
  
1月 24 08:54:31 WellDone dockerd[1549]: time="2024-01-24T08:54:31.067895045+08:00" level=info msg="API listen on /run/docker.sock"  
1月 24 08:54:31 WellDone systemd[1]: Started Docker Application Container Engine.  
1月 24 16:13:48 WellDone dockerd[1549]: time="2024-01-24T16:13:48.185008219+08:00" level=info msg="ignoring event" container=8ad99af82d8a41dd661d>  
1月 24 16:13:48 WellDone dockerd[1549]: time="2024-01-24T16:13:48.189484205+08:00" level=warning msg="ShouldRestart failed, container will not be>  
1月 24 21:58:08 WellDone dockerd[1549]: time="2024-01-24T21:58:08.024915139+08:00" level=info msg="ignoring event" container=27fd28e2993f31b170b8>  
1月 24 21:58:08 WellDone dockerd[1549]: time="2024-01-24T21:58:08.029986730+08:00" level=warning msg="ShouldRestart failed, container will not be>  
1月 25 10:46:16 WellDone dockerd[1549]: time="2024-01-25T10:46:16.329180722+08:00" level=info msg="Container failed to exit within 10s of signal >  
1月 25 10:46:16 WellDone dockerd[1549]: time="2024-01-25T10:46:16.350757439+08:00" level=info msg="ignoring event" container=b1223add00f36bbb3246>  
1月 25 10:49:21 WellDone dockerd[1549]: time="2024-01-25T10:49:21.993755983+08:00" level=info msg="Container failed to exit within 10s of signal >  
1月 25 10:49:22 WellDone dockerd[1549]: time="2024-01-25T10:49:22.015822650+08:00" level=info msg="ignoring event" container=edb0e153b45dbe62acd8>  
lines 1-28/28 (END)

四、部署wechat镜像

  1. 下载Ward镜像
docker pull bestwu/wechat:latest  
  
root@HEJIAJIN-FX506HE:/docker_software/docker-compose/docker-tools# docker pull bestwu/wechat  
Using default tag: latest  
latest: Pulling from bestwu/wechat  
f21eee950c89: Pull complete   
11ce96be0dbe: Pull complete   
213b37605fda: Pull complete   
fb5f4607d644: Pull complete   
996bef3d98a0: Pull complete   
6181aef875e7: Pull complete   
892cf94c8e7a: Pull complete   
Digest: sha256:f0a3b04aae119ed2d7bb9e6f1f8e5a3cf39a435b028fd9ddd733680fd5639693  
Status: Downloaded newer image for bestwu/wechat:latest  
docker.io/bestwu/wechat:latest  
  
之后,要使我们可以访问到图形化的wechat,这时候涉及到了一个命令xhost  
  
那什么是xhost?
  
xhost是一个用来控制服务器图形界面访问权限的工具。服务器是跑在类Unix操作系统上的软件,它管理和提供图形界面服务。xhost允许用户指定哪些用户和主机可以显示图形界面上的窗口。
  
到时候我们的docker启动后还要执行以下xhost +,因为我们这里是个人的测试环境,所以没有指定用户名和主机名  
  
xhost + 的作用  
使用xhost+命令可以让任何用户从任何主机连接到服务器。这个命令会关闭X服务器的访问控制,这意味着任何人都没有限制地访问你的服务器。出于安全考虑,这通常不是推荐的操作,因为它会使你的会话对任何人开放,并可能导致安全风险。
  
正确的用法通常是使用xhost加上特定的用户名或主机名来允许访问,例如:
xhost +SI:localuser:username  
##这条命令将允许本地用户username访问服务器。
  
或者只允许特定的远程主机访问:
xhost +hostname  
##这条命令允许来自hostname的用户访问服务器。
  
那么xhost与Docker是什么关系?
在使用Docker容器进行图形界面应用的开发时,有时需要将容器内运行的图形应用显示到宿主机的屏幕上。Docker容器通常是隔离的,并没有直接访问宿主机的服务器的权限。
要实现这一点,你需要在宿主机上允许容器访问服务器。一个常见的做法是在宿主机上运行 xhost + 来禁用访问控制,然后在启动 Docker 容器时,将服务器的Unix套接字共享给容器,这通常通过挂载一个卷来实现:
docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:rw docker_image  
  
-e DISPLAY 设置环境变量 DISPLAY,让容器知道如何连接服务器。
-v /tmp/.X11-unix:/tmp/.X11-unix:rw 将宿主机的服务器 Unix 套接字目录挂载到容器中,这样容器就可以通过这个套接字与宿主机的服务器通信。
为了安全起见,在完成图形界面应用的运行之后,应该通过运行 xhost - 命令来重新启用访问控制。
  
要注意的是,这种方法存在安全隐患,因为它允许任何应用接入你的服务器。更安全的方法是只授权特定的Docker容器访问服务器,而不是使用 xhost + 完全关闭访问控制。


  1. 创建容器

使用docker快速创建wechat的容器。

完整创建过程:
  
1.使用docker-cli启动一个wechat的容器。
  
docker run -d --name wechat\  
    --device /dev/snd\  
    --ipc=host\  
    -v /tmp/.X11-unix:/tmp/.X11-unix\  
    -v /docker_software/wechat/WeChatFiles:/WeChatFiles\  
    -v /docker_software/wechat:/he\  
    -e DISPLAY=unix$DISPLAY\  
    -e XMODIFIERS=@im=ibus\  
    -e QT_IM_MODULE=ibus\  
    -e GTK_IM_MODULE=ibus\  
    -e GID=`id -g`\  
    -e UID=`id -u`\  
    bestwu/wechat  
  
2.使用docker-compose启动一个wechat的容器  
  
version: '3.9'  
services:  
    wechat:  
        image: bestwu/wechat  
        user: '`\'  
        environment:  
            - UID=`id  
            - GID=`id  
            - GTK_IM_MODULE=ibus\  
            - QT_IM_MODULE=ibus\  
            - XMODIFIERS=@im=ibus\  
            - DISPLAY=unix$DISPLAY\  
        volumes:  
            - '/docker_software/wechat:/he\'  
            - '/docker_software/wechat/WeChatFiles:/WeChatFiles\'  
            - '/tmp/.X11-unix:/tmp/.X11-unix\'  
        ipc: host\  
        devices:  
            - /dev/snd\  
        container_name: wechat\  
  
注:
1. 上面的挂载路径需要自己创建。如             
- '/docker_software/wechat:/he\'  
- '/docker_software/wechat/WeChatFiles:/WeChatFiles\'  
2. 如果你是ibus输入法,将代码中的fcitx改成ibus!,如果你是搜狗,就是fcitx  
            - GTK_IM_MODULE=ibus\  
            - QT_IM_MODULE=ibus\  
            - XMODIFIERS=@im=ibus\  
            -------------------------  
            - GTK_IM_MODULE=fcitx\  
            - QT_IM_MODULE=fcitx\  
            - XMODIFIERS=@im=fcitx\  
  
3.容器启动前,记得执行xhost +,创建容器后,就会自动弹窗微信登陆框  
4.常见问题  
a.Docker的微信后,字体的dpi不对,因为它这个其实是源自于wine的微信,wine也是有同样的问题的。
进入容器内部,docker exec -it wechat /bin/bash  
切换到wechat用户su wechat  
输入命令  
WINEPREFIX=~/.deepinwine/Deepin-WeChat/ deepin-wine winecfg  
在弹出窗口中,显示选项,找到屏幕分辨率,改成200dpi  
b.不小心退了微信,打不开微信,那就重启容器即可  
docker restart wechat
  1. 检查容器运行状态

检查容器的运行状态,确保服务的正常运行。

docker ps

root@WellDone:/home/goodjob# docker ps  
CONTAINER ID   IMAGE                                                       COMMAND                   CREATED         STATUS         PORTS                                       NAMES  
63f383e80323   bestwu/wechat                                                      "/entrypoint.sh"          27 minutes ago   Up 27 minutes                                                           wechat

五、访问wechat

启动容器后,会自动弹窗微信登陆

六、wine-wechat安装(个人使用觉得最好)

1.首先打开终端,更新软件源

sudo apt-get update

2运行下面的命令,添加deepin-wine仓库。

wget -O- https://deepin-wine.i-m.dev/setup.sh | sh

3.sudo apt-get install com.qq.weixin.deepin

安装完,注销一下登陆就会看到logo。个人认为,这是ubuntu的微信最好用的一个,已知截图不能用,公众号点开会黑页,但是你设置下默认浏览器打开文章就行。